C# 异步等待HttpClient.PostAsync调用

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

我正在尝试将呼叫包装到PostAsync,这样就不必在代码库中重新编码呼叫序列。我遇到的问题是,我从调用中分配的HttpResponseMessage与我的方法的使用者调用的HttpResponseMessage不同。代码如下:

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
的响应

不要公开单个class
HttpResponseMessage
字段,如果在同一实例上同时调用,则该字段可能会过时。而是每次返回一个新实例:

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);