繁体   English   中英

使用async / await并返回Task <HttpResponseMessage> 来自ASP.NET Web API方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM