ASP.NET WEB API 我需要异步客户端吗
ASP.NET WEB API do i need async client
我有一个公开某些异步方法的 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);
}
我还有一个 class 库使用 API 和 System.Net.WebRequest 像这样:
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;
}
Does the response need to be retrievend async? If so, why?
不,不是。您需要将服务器端的操作方式与客户端查询端点的方式分开。当您公开一个 async Task
的方法时,您在服务器端调用中声明您正在进行异步调用。这对调用者是透明的,他得到的只是一个 API 端点,他对你的内部实现一无所知。
请记住,即使您在服务器端使用 async
,请求一旦完成也只会 return 到调用者。
我有一个公开某些异步方法的 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);
}
我还有一个 class 库使用 API 和 System.Net.WebRequest 像这样:
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;
}
Does the response need to be retrievend async? If so, why?
不,不是。您需要将服务器端的操作方式与客户端查询端点的方式分开。当您公开一个 async Task
的方法时,您在服务器端调用中声明您正在进行异步调用。这对调用者是透明的,他得到的只是一个 API 端点,他对你的内部实现一无所知。
请记住,即使您在服务器端使用 async
,请求一旦完成也只会 return 到调用者。