3

我在使用RestSharp客戶端的Windows Phone 8的項目下面的代碼:HttpClient的上傳MultipartFormData打2框架

public async Task<string> DoMultiPartPostRequest(String ext, JSonWriter jsonObject, ObservableCollection<Attachment> attachments) 
    { 
     var client = new RestClient(DefaultUri); 
     // client.Authenticator = new HttpBasicAuthenticator(username, password); 

     var request = new RestRequest(ext, Method.POST); 

     request.RequestFormat = DataFormat.Json; 
     request.AddParameter("json", jsonObject.ToString(), ParameterType.GetOrPost); 

     // add files to upload 
     foreach (var a in attachments) 
      request.AddFile("attachment", a.FileBody, "attachment.file", a.ContType); 

     var content = await client.GetResponseAsync(request); 

     if (content.StatusCode != HttpStatusCode.OK) 
      return "error"; 

     return content.Content; 
    } 

提琴手顯示生成的頭:

POST http://192.168.1.101:9000/rayz/create HTTP/1.1 
Content-Type: multipart/form-data; boundary=-----------------------------28947758029299 
Content-Length: 71643 
Accept-Encoding: identity 
Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml 
User-Agent: RestSharp 104.1.0.0 
Host: 192.168.1.101:9000 
Connection: Keep-Alive 
Pragma: no-cache 

-------------------------------28947758029299 
Content-Disposition: form-data; name="json" 

{ 
    "userId": "2D73B43390041E868694A85A65E47A09D50F019C180E93BAACC454488F67A411", 
    "latitude": "35.09", 
    "longitude": "33.30", 
    "accuracy": "99", 
    "maxDistance": "dist", 
    "Message": "mooohv" 
} 
-------------------------------28947758029299 
Content-Disposition: form-data; name="attachment"; filename="attachment.file" 
Content-Type: image/jpeg 

?????JFIF??`?`?????C? $" &0P40,,0bFJ:Ptfzxrfpn????????np????????|????????????C"$$0*0^44^?p??????????????????????????????????????????????????????`?"?????????????? 
-------------------------------28947758029299 

上述工程的代碼在Play2 API上很好。但是,由於RestSharp似乎並不穩定,我決定使用Microsoft提供的本地HttpClient。

因此,我寫了使用的HttpClient做同樣工作的另一個功能:

public async Task<string> DoMultiPartPostRequest2(String ext, JSonWriter jsonObject, 
                   ObservableCollection<Attachment> attachments) 
    { 
     var client = new HttpClient(); 

     var content = new MultipartFormDataContent(); 

     var json = new StringContent(jsonObject.ToString()); 
     content.Add(json, "json"); 

     foreach (var a in attachments) 
     { 
      var fileContent = new StreamContent(new MemoryStream(a.FileBody)); 
      fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") 
      { 
       Name = "attachment", 
       FileName = "attachment.file" 
      }; 
      fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(a.ContType); 
      content.Add(fileContent); 
     } 

     var resp = await client.PostAsync(DefaultUri + ext, content); 

     if (resp.StatusCode != HttpStatusCode.OK) 
      return "error"; 

     var reponse = await resp.Content.ReadAsStringAsync(); 

     return reponse; 
    } 

是從代碼生成的標題是:

POST http://192.168.1.101:9000/rayz/create HTTP/1.1 
Accept: */* 
Content-Length: 6633 
Accept-Encoding: identity 
Content-Type: multipart/form-data; boundary="e01b2196-d24a-47a2-a99b-e82cc4a2f92e" 
User-Agent: NativeHost 
Host: 192.168.1.101:9000 
Connection: Keep-Alive 
Pragma: no-cache 

--e01b2196-d24a-47a2-a99b-e82cc4a2f92e 
Content-Type: text/plain; charset=utf-8 
Content-Disposition: form-data; name=json 

{ 
    "userId": "2D73B43390041E868694A85A65E47A09D50F019C180E93BAACC454488F67A411", 
    "latitude": "35.09", 
    "longitude": "33.30", 
    "accuracy": "99", 
    "maxDistance": "dist", 
    "Message": "test" 
} 
--e01b2196-d24a-47a2-a99b-e82cc4a2f92e 
Content-Disposition: form-data; name=attachment; filename=attachment.file 
Content-Type: image/jpeg 

?????JFIF??`?`?????C? $" &0P40,,0bFJ:Ptfzxrfpn????????np????????|????????????C"$$0*0^44^?p????????????????????????????????????????????????????????"?????????????? 
--e01b2196-d24a-47a2-a99b-e82cc4a2f92e-- 

到目前爲止好。從我的角度來看,這兩個標題似乎是相同的。

但是,當我在執行Http.MultipartFormData body = request().body().asMultipartFormData();後調試Play 2 API時,我注意到多部分數據未被正確解析。

更具體地在體內可變日提交的多部分如下:

MultipartFormData(Map(),List(),List(BadPart(Map(ntent-type -> text/plain; charset=utf-8, content-disposition -> form-data; name=json)), BadPart(Map()), BadPart(Map()), BadPart(Map()), BadPart(Map())),List()) 

正如你可以注意到它具有幾個(實際上5在本例中)BadParts。 例如:BadPart(Map(ntent-type -> text/plain; charset=utf-8, content-disposition -> form-data; name=json))

任何人都可以看到這裏出了什麼問題嗎? HttpClient產生的頭文件是否有誤?

回答

4

這裏是解決方案。(黑客)

似乎與播放框架問題時的邊界在它的報價。

所以我添加以下代碼,以消除他們創建多後:

var content = new MultipartFormDataContent(); 

foreach (var param in content.Headers.ContentType.Parameters.Where(param => param.Name.Equals("boundary"))) 
    param.Value = param.Value.Replace("\"", String.Empty); 

最後我不得不手動添加引號「\」」爲特定值上類似如下的標題:

原文:Content-Disposition: form-data; name=attachment; filename=attachment.file 更改爲:Content-Disposition: form-data; name="attachment"; filename="attachment.file"

產地al:Content-Disposition: form-data; name=json 更改爲:Content-Disposition: form-data; name="json"

我不認爲它是一個錯誤引號或沒有在報頭的任何地方,也許在播放框架解析應相應地修復。