[英]Using async/await and returning Task<HttpResponseMessage> From ASP.NET Web API Methods
我有一個像這樣的可移植類庫(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就像是對象的容器,所以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;
}
}
並打電話給:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.