【发布时间】:2016-01-27 21:04:18
【问题描述】:
我正在使用 System.Net.Http.HttpClient 进行 HTTP 调用。看来所有调用都必须是异步的。
假设我的项目结构如下: MVC Web App -> 业务层 -> 数据层
在数据层中,我对 Web API 进行 HTTP 调用以返回数据,最终我使用了这样的函数:
public async Task<IList<Product>> GetProducts()
{
HttpResponseMessage response = await client.GetAsync("api/products");
string data = await response.Content.ReadAsStringAsync();
IList<Product> products = JsonConvert.DeserializeObject<IList<Product>>(data);
return products;
}
然后进入 BusinessLayer:
public Task<IList<Product>> GetProducts(string name = null)
{
return _repository.GetProducts(name);
}
最后在MVC控制器中:
public IActionResult Index()
{
Task<IList<Product>> ProductsTask = _manager.GetProducts();
IList<Product> ProductsNonTask = products.Result.ToList();
return View();
}
我真的必须让每个函数都返回一个 Task<IList<Product>> 类型的列表,直到我的 MVC 控制器?正如您在 MVC 控制器中看到的那样,我必须首先检索产品,并将 Task 包裹在它们周围。当我通过它查看产品列表时,调试器看起来有点奇怪。因此,如您所见,我将它们转换为常规产品列表。
我想知道让我的所有函数返回类型 Task<IList<Product>> 一直到我的 MVC 控制器是否是正确的做法,或者是否有解决方法以便我的函数仍然可以返回标准列表的产品,但继续使用 HttpClient 的异步功能?
更新:执行以下操作有什么问题吗:
public IList<Product> GetProducts()
{
Task<HttpResponseMessage> response = client.GetAsync("api/products");
if (response.Result.IsSuccessStatusCode)
{
string data = response.Result.Content.ReadAsStringAsync().Result;
IList<Product> products = JsonConvert.DeserializeObject<IList<Product>>(data);
retVal = products;
}
}
【问题讨论】:
-
Is there anything wrong with doing the following:是的,代码无法编译(出于多种不同的原因)。你可以通过简单地编译它来解决这个问题。 -
我很抱歉我不小心留下了 await 关键字,因为我复制、粘贴和更改了。现在已经修复了。
-
由于多种不同的原因,代码仍然无法编译。
标签: c# asp.net-mvc asp.net-web-api async-await httpclient