C# 使用异步/等待和返回任务<;HttpResponseMessage>;来自ASP.NET Web API方法

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

我有一个可移植类库(PCL)方法,如下所示:

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而言,返回最终用字符串完成的任务应等同于直接返回该字符串。