Ste*_*hot 5 c# httpclient xamarin xamarin.forms
在我的 Xamarin 表单应用程序中
当我使用以下代码时,我正在尝试将 Json 字符串发布到我的网络服务,即 RestFul API:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
异常抛出:
请求需要缓冲数据才能成功
堆栈跟踪:
{System.Net.WebException:请求需要缓冲数据才能成功。在 System.Net.HttpWebRequest.EndGetResponse (System.IAsyncResult asyncResult) [0x00064] 在 :0 在 System.Threading.Tasks.TaskFactory
1[TResult].FromAsyncCoreLogic (System.IAsyncResult iar, System.Func2[T,TResult] endFunction, System.Action1[T] endAction, System.Threading.Tasks.Task1[TResult] promise, System.Boolean requiresSynchronization) [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.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task 任务)[0x0002e] ] 在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task 任务)中:0 中 [0x0000b] 在 System.Runtime.CompilerServices.ConfiguredTaskAwaitable 中:01+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.ConfiguredTaskAwaitable1+ConfiguredTaskAwaiter[TResult].GetResult()[0x00000] in :0 at System.Net.Http.HttpClient+c__async0.MoveNext() [0x000f3] in <566d6cf6576345098cb5e08ad43d5e78> 的前一个堆栈位置:0异常被抛出 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in :0 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x0004e] in :0在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task 任务)[0x0002e] 中:0 在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task 任务)[0x0000b] 中:0 在 System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult () [0x00000] 在 :0 在 MyAPP。Webservice+d__4.MoveNext () [0x000d0] 在 C:\MyProject\Classes\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;
}
}
Run Code Online (Sandbox Code Playgroud)
由于您正在使用.Resultor.Wait或await这最终会导致您的代码出现死锁。
您可以ConfigureAwait(false)在防止死锁的async方法中使用
像这样:
response = await client.PostAsync(uri, RoleContent).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)
您可以
ConfigureAwait(false)尽可能使用 Don't Block Async Code 。
您可以使用SendAsync()withHttpCompletionOption.ResponseHeadersRead 代替PostAsync(),问题在于读取响应,它在未准备好时读取。
var request = new HttpMessageRequest(yourUrl);
request.Content = yourContent;
var response = await client.SendAsync(request,
HttpCompletionOption.ResponseHeadersRead);
Run Code Online (Sandbox Code Playgroud)
使用HttpCompletionOption.ResponseHeadersRead
一旦响应可用并且标头被读取,操作就应该完成。内容还没读完。
编辑
您可以HttpWebRequest使用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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18584 次 |
| 最近记录: |