C# 使用异步/等待和返回任务<;HttpResponseMessage>;来自ASP.NET Web API方法
我有一个可移植类库(PCL)方法,如下所示:C# 使用异步/等待和返回任务<;HttpResponseMessage>;来自ASP.NET Web API方法,c#,.net,asp.net-web-api,task-parallel-library,async-await,C#,.net,Asp.net Web Api,Task Parallel Library,Async Await,我有一个可移植类库(PCL)方法,如下所示: public async Task<string> GetLineStatuses() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync()) { ret
public async Task<string> GetLineStatuses()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
{
return response.GetResponseStream().ReadAllText();
}
}
public async Task<HttpResponseMessage> Get()
{
HttpResponseMessage response = new HttpResponseMessage();
string statuses = await service.GetStatuses();
response.Content = new StringContent(statuses);
return response;
}
public异步任务GetLineStatuses()
{
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(Url);
使用(HttpWebResponse=(HttpWebResponse)wait request.GetResponseAsync())
{
返回response.GetResponseStream().ReadAllText();
}
}
我的ASP.NET Web Api方法如下所示:
public async Task<string> GetLineStatuses()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
{
return response.GetResponseStream().ReadAllText();
}
}
public async Task<HttpResponseMessage> Get()
{
HttpResponseMessage response = new HttpResponseMessage();
string statuses = await service.GetStatuses();
response.Content = new StringContent(statuses);
return response;
}
公共异步任务Get()
{
HttpResponseMessage response=新的HttpResponseMessage();
字符串状态=等待服务。GetStatuses();
response.Content=新的StringContent(状态);
返回响应;
}
在Web API中返回任务的含义是什么。允许这样做吗?我想使用wait的唯一原因是我可以使用可移植类库(PCL)。最佳做法是什么?我应该有一个同步版本的方法和一个异步版本吗?性能、代码可读性和可维护性的影响是什么
如果我返回的是
Task
而不是Task
,我也会有同样的效果吗?异步和等待在ASP.NET中是完全可以接受的。下面是一段Scott Handselman的视频演示:
“如果我返回的是Task
,而不是Task
,我也会有同样的效果吗?”
我不太清楚你这是什么意思。任务类似于对象的容器,因此任务
将包含字符串结果,任务
将包含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;
}
}
我相信.NET4.5中的ASP.NET确实支持
async
方法,因此您的代码应该可以正常工作。你为什么要问这是否被允许?您没有试过吗?我还想知道性能、代码可读性和可维护性的含义是什么?在Web API中,您可以返回任何要序列化为内容的对象,或者返回HttpResponseMessage。这就是我的意思,我还是不明白你的意思。请记住,它不是返回字符串,而是返回任务。Task.Result中的字符串可以呈现为内容,但任务本身不能。返回字符串和返回带有StringContent和两个不同内容的HttpResponseMessage。如果返回字符串,WebAPi将使用内容协商来查找可以序列化该字符串的格式化程序。如果返回StringContent,则该字符串将直接在响应中发出。但就WebAPI而言,返回最终用字符串完成的任务应等同于直接返回该字符串。