2017-06-12 33 views
0

我卡在xamarin.forms中發佈多部分形式的數據。當我嘗試使用POSTMAN時,它的所有工作都很好,但是沒有使用我在xamarin.forms中的代碼。我不知道代碼有什麼問題。我正在使用一個叫RestSharp port as PCL and for .NET Core的庫。與多部分形式的數據卡住 - Xamarin.forms

這裏是郵遞員代碼

var client = new RestClient("http://192.168.2.126:86/Appointment.svc/UploadFileios"); 
var request = new RestRequest(Method.POST); 
request.AddHeader("postman-token", "11a61861-ed9c-2f35-751b-6b615907c269"); 
request.AddHeader("cache-control", "no-cache"); 
request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"); 
request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"phone\"\r\n\r\n81234518\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"address\"\r\n\r\nAddress Dummy House\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"password\"\r\n\r\n123\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"confpassword\"\r\n\r\n123\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nAlex Chengalan Paily\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--", ParameterType.RequestBody); 
IRestResponse response = client.Execute(request); 

以下是我與xamarin.forms代碼。

var client = new RestClient(url); 
        var request = new RestRequest(Method.POST); 
        string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); 
        //string boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW"; 
        request.AddHeader("cache-control", "no-cache"); 
        request.AddHeader("content-type", "multipart/form-data; boundary=" + boundary); 
        string name = "multipart/form-data; boundary=" + boundary; 


        string formdataTemplate = "--" + boundary + 
         "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n"; 
        string formitem = null; 
        foreach (string key in nvc.Keys) 
        { 
         formitem = formitem + string.Format(formdataTemplate, key, nvc[key]); 
        } 
        Debug.WriteLine("Items: " + formitem); 
        request.AddParameter(name, formitem, ParameterType.RequestBody); 
IRestResponse response = await client.Execute(request); 

但是我在這裏從服務器得到一個解析錯誤。請幫助我解決這個問題。

+0

你得到的錯誤是什麼? –

+0

它是一個從後端觸發的解析異常,這是一個自定義消息。 –

+0

你能分享解析錯誤訊息嗎?可能是這個鏈接將幫助你[在C#中的多部分形式發佈](https://briangrinstead.com/blog/multipart-form-post-in-c/) –

回答

0

我對RestSharp庫不夠熟悉,但這裏有一個支持文件流和其他變量的工作示例,沒有任何第三方依賴關係,並且在PCL中使用Xamarin.Forms工作(注意,您不需要手動混淆邊界):

try 
{ 
    var file = await PCLStorage.FileSystem.Current.LocalStorage.GetFileAsync(device.ClientCodePhoto); 
    using(Stream fileStream = await file.OpenAsync(PCLStorage.FileAccess.Read)) 
    using(var client = new HttpClient()) 
    using(var content = new MultipartFormDataContent()) 
    { 
     content.Add(new StreamContent(fileStream), "client_code_image", "upload.jpg"); 

     var values = new[] 
     { 
      new KeyValuePair<string, string>("client_code", device.ClientCode), 
      new KeyValuePair<string, string>("registered_by", device.RegisteredBy), 
      new KeyValuePair<string, string>("notes", device.Notes ?? string.Empty), 
      new KeyValuePair<string, string>("sim_code", device.SimCode), 
      new KeyValuePair<string, string>("qr_codes", device.QrCodes) 
     }; 

     foreach(var keyValuePair in values) 
      content.Add(new StringContent(keyValuePair.Value), string.Format("\"{0}\"", keyValuePair.Key)); 

     using(var result = await client.PostAsync($"{Constants.Server}devices/", content)) 
     { 
      var input = await result.Content.ReadAsStringAsync(); 

      if(result.IsSuccessStatusCode) 
      { 
       // do something with the result 
      } 
     } 
    } 
} 
catch(Exception ex) 
{ 
    Debug.WriteLine(ex.Message); 
    // something went wrong 
}