使用异步/等待和返回任务 从的ASP.NET Web API方法(Using async/aw

2019-08-04 22:17发布

我有一个这样的便携式类库(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;
}

什么是网络API返回任务的影响。 这可以吗? 我想用等待唯一的理由是这样我就可以使用便携式类库(PCL)。 什么是最好的做法是什么? 我应该有我的方法的syncronous版本和asyncronous版本? 什么是性能和代码的可读性和可维护性的影响?

此外,我也有同样的效果,如果我回到Task<string>而不是Task<HttpResponseMessage>

Answer 1:

异步和等待在ASP.NET完全可以接受的。 这里的斯科特Handselman视频demoing它: http://www.asp.net/vnext/overview/aspnet/async-and-await

“我也有同样的效果,如果我回到Task<string>而不是Task<HttpResponseMessage> ?”

真的不知道你这个是什么意思。 任务就像是该对象的容器,所以Task<string>将包含您的字符串结果和Task<HttpResponseMessage>将包含您的HttpResponseMessage结果......那是什么意思呀? 我认为这两种方法是完全可以接受的。 如果你只需要字符串,然后用去。 在返回比你更需要没有任何意义。



Answer 2:

作为替代方案:

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;


文章来源: Using async/await and returning Task From ASP.NET Web API Methods