2016-02-16 4 views
3

У меня есть клиент RestSharp и собственный хост-сервер Nancy. Что я хочуНэнси: синтаксический анализ запросов «multipart/form-data»

Чтобы отправить многокомпонентные данные формы от клиента и анализировать эти данные легко с сервера:

Отправить бинарный файл и данные JSon как многоэлементные формы данные от RestSharp клиента и возможности получить бинарные файл и объект Json от Nancy сервера

на клиенте с помощью Restsharp: [http://restsharp.org/] Я пытаюсь отправить «многочастные/данные формы» запросы, который содержит двоичный Файл плюс некоторые мета-данные в формате JSON:

var client = new RestClient(); 
... 

IRestRequest restRequest = new RestRequest("AcmeUrl", Method.POST); 

restRequest.AlwaysMultipartFormData = true; 
restRequest.RequestFormat = DataFormat.Json; 

// I just add File To Request 
restRequest.AddFile("AudioData", File.ReadAllBytes("filePath"), "AudioData"); 

// Then Add Json Object 
MyObject myObject = new MyObject(); 
myObject.Attribute ="SomeAttribute"; 
.... 

restRequest.AddBody(myObject); 

client.Execute<MyResponse>(request); 

На сервере с помощью Нэнси [http://nancyfx.org/], Itry получить файл и JSon Object [Meta Data]

// Try To Get File : It Works 
var file = Request.Files.FirstOrDefault(); 


// Try To Get Sended Meta Data Object : Not Works. 
// Can Not Get MyObject Data 

MyObject myObject = this.Bind<MyObject>(); 

ответ

1

Для многотомных данных, код Нэнси является бит более сложный. Попробуйте что-то вроде этого:

Post["/"] = parameters => 
    { 
     try 
     { 
      var contentTypeRegex = new Regex("^multipart/form-data;\\s*boundary=(.*)$", RegexOptions.IgnoreCase); 
      System.IO.Stream bodyStream = null; 

      if (contentTypeRegex.IsMatch(this.Request.Headers.ContentType)) 
      { 
       var boundary = contentTypeRegex.Match(this.Request.Headers.ContentType).Groups[1].Value; 
       var multipart = new HttpMultipart(this.Request.Body, boundary); 
       bodyStream = multipart.GetBoundaries().First(b => b.ContentType.Equals("application/json")).Value; 
      } 
      else 
      { 
       // Regular model binding goes here. 
       bodyStream = this.Request.Body; 
      } 

      var jsonBody = new System.IO.StreamReader(bodyStream).ReadToEnd(); 

      Console.WriteLine("Got request!"); 
      Console.WriteLine("Body: {0}", jsonBody); 
      this.Request.Files.ToList().ForEach(f => Console.WriteLine("File: {0} {1}", f.Name, f.ContentType)); 

      return HttpStatusCode.OK; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Error!!!!!! {0}", ex.Message); 
      return HttpStatusCode.InternalServerError; 
     } 
    }; 

Посмотрите: http://www.applandeo.com/en/net-and-nancy-parsing-multipartform-data-requests/

Смежные вопросы