2016-12-22 22 views
1

を働いていないと、私は次のコードを使用するときのRESTful API である私は私のWebサービスウィッヒにJSON文字列を投稿しようとしているアプリのHttpClientをPostAsync()私のXamarinで

フォーム:

public static async Task<bool> SaveRolAsync(Methods Method, Role Rol) 
    { 
     try 
     { 
      HttpClient client = new HttpClient(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      var uri = ("http://myservice.com/roles/"); 
      HttpResponseMessage response = null; 

      try 
      { 
       var jSettings = new JsonSerializerSettings(); 
       jSettings.NullValueHandling = NullValueHandling.Ignore; 
       jSettings.MissingMemberHandling = MissingMemberHandling.Ignore; 

       var JsonData = JsonConvert.SerializeObject(Rol); 
       var RoleContent = new StringContent(JsonData, Encoding.UTF8, "application/json"); 

       if (Method == Methods.PUT || Method == Methods.PATCH) 
       { 
        response = await client.PutAsync(uri, RoleContent); 
       } 

       if (Method == Methods.POST) 
       { 
        response = await client.PostAsync(uri, RoleContent); 
       } 

       if (Method == Methods.DELETE) 
       { 
        throw new NotImplementedException(); 
       } 

       return response.IsSuccessStatusCode; 

      } 
      catch (JsonException jse) 
      { 
       return false; 
      } 
     } 
     catch (Exception ex) 
     { 
      // Exceptions Throws here 
      // @T This line i got The request requires buffering data to succeed 
      return false; 
     } 
    } 

例外がスローされます:

要求が成功するためにバッファリングデータを必要

スタックトレース:

{System.Net.WebException:要求は成功し にバッファリングデータが必要です。 System.Threading.Tasks.TaskFactory 1[TResult].FromAsyncCoreLogic (System.IAsyncResult iar, System.Func 2 [T、TResult] ENDFUNCTIONで0、 System.Action 1[T] endAction, System.Threading.Tasks.Task 1 [TResult] : でSystem.Net.HttpWebRequest.EndGetResponse(System.IAsyncResult asyncResult)[0x00064]で約束、System.Booleanは同期が必要)[0x00014] in :0 ---例外がスローされた前の場所からのスタックトレースの終わり--- でSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in :0で System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Taskタスク)[0x0004e]で :で0 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Taskタスク)で0: 10 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Taskタスク)[0x0002e] 【0x0000b] で:System.Runtime.CompilerServices.ConfiguredTaskAwaitable で0 1+ConfiguredTaskAwaiter[TResult].GetResult () [0x00000] in <a66f207c1e5949e9a252c01e27bbd34e>:0 at System.Net.Http.HttpClientHandler+<SendAsync>c__async0.MoveNext() [0x0041e] in <566d6cf6576345098cb5e08ad43d5e78>:0 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in <a66f207c1e5949e9a252c01e27bbd34e>:0 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x0004e] in <a66f207c1e5949e9a252c01e27bbd34e>:0 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in <a66f207c1e5949e9a252c01e27bbd34e>:0 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in <a66f207c1e5949e9a252c01e27bbd34e>:0 at System.Runtime.CompilerServices.ConfiguredTaskAwaitable 1 + ConfiguredTaskAwaiter [TResult] .GetResult ()[0x00000]:0 System.Net.Http.HttpClient + c__async0.MoveNextで() [0x000f3] in < 566d6cf6576345098cb5e08ad43d5e78>:0 ---例外がスローされた前の場所からのスタックトレースの終了--- でSystem.Runtime.ExceptionServices.ExceptionDisp atchInfo.Throw() [0x0000c]:0 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Taskタスク)[0x0004e] 中で:0 System.Runtime.CompilerServices.TaskAwaiterで での0 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Taskタスク)[0x0000b]: で.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Taskタスク)[0x0002e] 0で のMyAPP.Webservice + d__4.MoveNext()[0x000d0]の の0:255のSystem.Runtime.CompilerServices.TaskAwaiter`1 [TResult] .GetResult() [0x00000] C:\ MyProject \ Cla sses \ Webservice.cs:140}

**また試した:SendAsync()Ty M.Wiśnickiは**

public static async Task<bool> SaveRolAsync(MediwareLib.Methods Method, Role Rol) 
    { 
     try 
     { 
      HttpClient client = new HttpClient(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      var uri = (BaseRequestUrl + "roles/"); 
      HttpResponseMessage response = null; 
      var request = new HttpRequestMessage(); 

      try 
      { 
       var jSettings = new JsonSerializerSettings(); 
       jSettings.NullValueHandling = NullValueHandling.Ignore; 
       jSettings.MissingMemberHandling = MissingMemberHandling.Ignore; 

       var JsonData = JsonConvert.SerializeObject(Rol); 

       var RoleContent = new StringContent(JsonData, Encoding.UTF8, "application/json"); 

       if (Method == MediwareLib.Methods.PUT || Method == MediwareLib.Methods.PATCH) 
       { 
        request = new HttpRequestMessage(HttpMethod.Put, uri); 
        request.Content = RoleContent; 

        response = await client.SendAsync(request, 
        HttpCompletionOption.ResponseHeadersRead); 
       } 

       if (Method == MediwareLib.Methods.POST) 
       { 
        request = new HttpRequestMessage(HttpMethod.Post, uri); 
        request.Content = RoleContent; 

        response = await client.SendAsync(request, 
        HttpCompletionOption.ResponseHeadersRead); 
       } 

       if (Method == MediwareLib.Methods.DELETE) 
       { 
        throw new NotImplementedException(); 
        // response = await client.DeleteAsync(uri + Rol.Id); 
       } 

       return response.IsSuccessStatusCode; 

      } 
      catch (JsonException jse) 
      { 
       Globals.Log("SaveRolAsync: " + jse.ToString()); 
       return false; 
      } 
     } 
     catch (Exception ex) 
     { 
      Globals.Log("SaveRolAsync: " + ex.ToString()); 
      return false; 
     } 

    } 

enter image description here

+2

あなたの研究は何を示しましたか?あなたは[要求はHttpClientを成功させるためにデータをバッファリングする必要がありますか?](http://stackoverflow.com/questions/40368724/the-request-requires-buffering-data-to-succeed-httpclient)と[HttpClientでヘッドリクエスト]を読んでいましたか? http://stackoverflow.com/questions/25509233/head-request-with-httpclient)?あなたはPUTでも 'if(Method == Methods.POST)'を送っていることに気がつきましたか?あなたのサービスはリダイレクトで応答していますか? – CodeCaster

+0

私は他のstackoverflowの投稿を読んだが、私はGoogleの要求ではなくjsonの文字列を送信したい。 –

+0

HTTPリクエストは、検索結果またはJSONデータを含むかどうかにかかわらず、HTTPリクエストです。 – CodeCaster

答えて

1

あなたはHttpCompletionOption.ResponseHeadersRead代わりPostAsync()SendAsync()を使用することができ、問題は読書の応答であり、それは読んでいるとき、それは準備ができていません。応答が利用可能であり、ヘッダが読み込まれるとすぐに完了する必要がありHttpCompletionOption.ResponseHeadersRead

操作を使用して

var request = new HttpMessageRequest(yourUrl); 
request.Content = yourContent; 
var response = await client.SendAsync(request, 
HttpCompletionOption.ResponseHeadersRead); 

。内容はまだ読み込まれていません。

編集 あなたは.Resultまたは.Waitまたはawaitを使用しているので、これはあなたのコード内でデッドロックを引き起こしてしまいます代わりにHttpClient

public async Task<string> PostTest(object sampleData, string uri) 
    { 
     var request = (HttpWebRequest) WebRequest.Create(new Uri(uri)); 
     request.ContentType = "application/json"; 
     request.Method = "POST"; 
     request.Timeout = 4000; //ms 
     var itemToSend = JsonConvert.SerializeObject(sampleData); 
     using (var streamWriter = new StreamWriter(await request.GetRequestStreamAsync())) 
     { 
      streamWriter.Write(itemToSend); 
      streamWriter.Flush(); 
      streamWriter.Dispose(); 
     } 

     // Send the request to the server and wait for the response: 
     using (var response = await request.GetResponseAsync()) 
     { 
      // Get a stream representation of the HTTP web response: 
      using (var stream = response.GetResponseStream()) 
      { 
       var reader = new StreamReader(stream); 
       var message = reader.ReadToEnd(); 
       return message; 
      } 
     } 
    } 
+0

同じエラー:(System.Net.WebException:リクエストにバッファリングが必要です) –

+0

@StefanvandeLaarschot新しいHttpRequestMessage(HttpMethod.Post 、uri); 'しかし、' HttpMethod'を使わずに、uriだけで使用しました。 –

+0

HttpMethod、uri、またはStringをUriとして期待できません –

1

HttpWebRequestを使用することができます。

あなたがデッドロックこのような

防止ためConfigureAwait(false)asyncのメソッドを使用することができます:あなたがいないブロック非同期コードのためConfigureAwait(false)可能な限りを使用することができます

response = await client.PostAsync(uri, RoleContent).ConfigureAwait(false); 

を。

関連する問題