C# 异步等待HttpClient.PostAsync调用
我正在尝试将呼叫包装到PostAsync,这样就不必在代码库中重新编码呼叫序列。我遇到的问题是,我从调用中分配的HttpResponseMessage与我的方法的使用者调用的HttpResponseMessage不同。代码如下:C# 异步等待HttpClient.PostAsync调用,c#,asynchronous,async-await,dotnet-httpclient,C#,Asynchronous,Async Await,Dotnet Httpclient,我正在尝试将呼叫包装到PostAsync,这样就不必在代码库中重新编码呼叫序列。我遇到的问题是,我从调用中分配的HttpResponseMessage与我的方法的使用者调用的HttpResponseMessage不同。代码如下: internal class RestHttpClient { public HttpResponseMessage ResponseMessage = new HttpResponseMessage(); public async void Send
internal class RestHttpClient
{
public HttpResponseMessage ResponseMessage = new HttpResponseMessage();
public async void SendRequest(string adaptiveUri, string xmlRequest)
{
using (HttpClient httpClient = new HttpClient())
{
StringContent httpConent = new StringContent(xmlRequest, Encoding.UTF8);
try
{
ResponseMessage = await httpClient.PostAsync(adaptiveUri, httpConent);
}
catch (Exception ex)
{
ResponseMessage.StatusCode = HttpStatusCode.InternalServerError;
ResponseMessage.ReasonPhrase = string.Format("RestHttpClient.SendRequest failed: {0}", ex);
}
}
}
}
我试着按如下方式调用该方法:
RestHttpClient restHttpClient = new RestHttpClient();
restHttpClient.SendRequest(adaptiveUri, xmlRequest);
return restHttpClient.ResponseMessage;
当我进行调用时,ResponseMessage对象始终包含Ok状态,即使这不是PostAsync调用实际返回的状态。之所以会出现这种情况,是因为您的方法是
async void
,它以“激发并忘记”的方式执行,因此,您看到的是响应消息实例返回的值,而不是PostAsync
的响应
不要公开单个classHttpResponseMessage
字段,如果在同一实例上同时调用,则该字段可能会过时。而是每次返回一个新实例:
public async Task<HttpResponseMessage> SendRequestAsync(string adaptiveUri, string xmlRequest)
{
using (HttpClient httpClient = new HttpClient())
{
StringContent httpConent = new StringContent(xmlRequest, Encoding.UTF8);
HttpResponseMessage responseMessage = null;
try
{
responseMessage = await httpClient.PostAsync(adaptiveUri, httpConent);
}
catch (Exception ex)
{
if (responseMessage == null)
{
responseMessage = new HttpResponseMessage();
}
responseMessage.StatusCode = HttpStatusCode.InternalServerError;
responseMessage.ReasonPhrase = string.Format("RestHttpClient.SendRequest failed: {0}", ex);
}
return responseMessage;
}
}
@阿列克谢,这不是复制品。这个问题根本不能回答OP的问题all@YuvalItzchakov根据标题它应该。。。但它不。。。删除。你知道它应该是斯蒂芬·克利里现有答案的副本。。。但我同意,复制品并没有表现出足够的爱来进行操作。这似乎是可行的。。有一点,但我从调用中看到的结果是:响应Id=1,状态=WaitingForActivation,Method=“{null}”,result=“{Not Not computed}”System.Threading.Tasks.Task我的UI只是在那里停留了一会儿,没有从服务调用中得到实际响应。你在哪里看到的?我的错误,我将send方法的调用方修改为使用async..wait,但更改没有生效。当我把它放回用户界面后,它做出了响应,呼叫完成了。谢谢@YuvalItzchakov感谢这个链接,在.NETFramework4.0中使用AsyncWait对我来说也很有用。,。
return await restHttpClient.SendRequestAsync(adaptiveUri, xmlRequest);