使用async/await返回Task从ASP.. NET Web API方法
本文关键字:ASP NET Web 方法 API HttpResponseMessage async await 返回 Task 使用 | 更新日期: 2023-09-27 17:49:51
我有一个这样的可移植类库(PCL)方法:
public async Task<string> GetLineStatuses()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
{
return response.GetResponseStream().ReadAllText();
}
}
我的ASP。. NET Web Api方法如下:
public async Task<HttpResponseMessage> Get()
{
HttpResponseMessage response = new HttpResponseMessage();
string statuses = await service.GetStatuses();
response.Content = new StringContent(statuses);
return response;
}
在Web API中返回Task的含义是什么?允许这样做吗?我想使用await的唯一原因是我可以使用可移植类库(PCL)。什么是最佳实践?我应该有一个同步版本的方法和一个异步版本?性能、代码可读性和可维护性意味着什么?
如果我返回Task<string>
而不是Task<HttpResponseMessage>
,我也会有同样的效果吗?
Async和await在ASP.NET中是完全可以接受的。这是Scott Handselman的演示视频:http://www.asp.net/vnext/overview/aspnet/async-and-await
"如果我返回Task<string>
而不是Task<HttpResponseMessage>
,我也会有同样的效果吗?"
我不太确定你的意思。任务就像对象的容器,所以Task<string>
将包含您的字符串结果和Task<HttpResponseMessage>
将包含您的HttpResponseMessage结果…你是这个意思吗?我认为两种方法都是完全可以接受的。如果你只需要绳子,那就用它吧。没有必要返回比你需要的更多。
作为备选项:
public static async Task<string> CallGET(string requestUri, string id = "")
{
string responseData;
using (var client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }))
{
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
Uri.TryCreate(new Uri(baseURI), $"{requestUri}{(string.IsNullOrEmpty(id) ? string.Empty : $"/{id}")}", out Uri fullRequestUri);
using (var response = await client.GetAsync(fullRequestUri))
{
responseData = await response.Content.ReadAsStringAsync();
}
return responseData;
}
}
和call将是:
var getListUsersResult = Utils.CallGET($"/v1/users").Result;
var resultset= JsonConvert.DeserializeObject(getListUsersResult, typeof(List<UsersDTO>)) as List<UsersDTO>;
UserDTO r = users.Where(d => d.Name.ToLower().Contains("test")).FirstOrDefault();
和另一个项目的调用:
var getUser = Utils.CallGET($"/v1/users", $"{USER_ID}").Result;
var getUserResponse = JsonConvert.DeserializeObject(getUser, typeof(UserDTO)) as UserDTO;