10

我有一个像这样的可移植类库(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 中返回任务的含义是什么。这是允许的吗?我想使用 await 的唯一原因是我可以使用可移植类库 (PCL)。最佳做法是什么?我应该有我的方法的同步版本和异步版本吗?性能和代码可读性和可维护性有何影响?

Task<string>如果我返回而不是返回,我也会有同样的效果Task<HttpResponseMessage>吗?

4

2 回答 2

5

Async 和 await 在 ASP.NET 中是完全可以接受的。这是一个演示它的 Scott Handselman 视频:http ://www.asp.net/vnext/overview/aspnet/async-and-await

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

不太清楚你的意思。Task 就像对象的容器,因此 aTask<string>将包含您的字符串结果,而 aTask<HttpResponseMessage>将包含您的 HttpResponseMessage 结果...这是您的意思吗?我认为这两种方法都是完全可以接受的。如果你只需要字符串,那就去吧。超过你需要的回报是没有意义的。

于 2012-12-28T14:19:22.557 回答
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;
于 2019-04-24T18:51:12.403 回答