ASP.NET WEB API 我需要异步客户端

本文关键字:异步 客户端 NET WEB API ASP | 更新日期: 2024-11-07 11:09:45

我有一个 Web API 应用程序,它公开了某些异步方法,例如:

public async Task<HttpResponseMessage> Put(string id){
  var data = await Request.Content.ReadAsStringAsync();
  //do something to put data in db
return Request.CreateResponse(HttpStatusCode.Ok);
}

我还有一个类库,它通过System.Net.WebRequest使用此API,如下所示:

   var request = (HttpWebRequest)WebRequest.Create(url);
   var response = await request.GetResponseAsync();

响应是否需要异步检索?如果是这样,为什么?或者我也可以使用request.GetResponse();.

我之前使用了GetResponse,它有时会抛出 500 错误 ( An asynchronous module or handler completed while an asynchronous operation was still pending )。一旦我将其更改为GetResponseAsync(),我就不再收到此错误。

编辑:有时会引发 500 错误的代码

我将 web api 方法简化为(只是为了检查 500 错误是业务逻辑还是其他错误)。注意:这是在将消费者更改为异步之后(第一个函数是消费者,然后是 api 方法):

    public HttpWebResponse(GetApiResponseForPut(string url, string putData, NameValueCollection headers)
    {
      var request = (HttpWebRequest)WebRequest.Create(url);
            request.CookieContainer = _cookieContainer;
            request.Method = "PUT";
            if (headers != null)
            {
                request.Headers.Add(headers);
            }
            var encoding = new ASCIIEncoding();
            var byte1 = new byte[0];
            if (putData != null)
            {
                byte1 = encoding.GetBytes(putData);
            }
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byte1.Length;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(byte1, 0, byte1.Length);
            requestStream.Close();
            var response = await request.GetResponseAsync();
            return (HttpWebResponse)response;
    }
    public async Task<HttpResponseMessage> Put(string id)
    {
      HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
      return response;
    }

ASP.NET WEB API 我需要异步客户端

响应是否需要异步检索?如果是这样,为什么?

不,它没有。您需要分离服务器端的操作方式和客户端查询终端节点的方式。当你公开一个async Task的方法时,你声明在服务器端调用中,你正在进行异步调用。这对调用者是透明的,他得到的只是一个 API 端点,他对你的内部实现一无所知。

请记住,即使您在服务器端使用 async,请求也只会在完成后返回给调用方。