Bla*_*ell 5 c# asp.net-mvc httpclient async-await asp.net-web-api
我正在使用System.Net.Http.HttpClient.进行HTTP调用.似乎所有调用都必须是异步的.
假设我有以下项目结构:MVC Web App - > Business Layer - > Data Layer
在数据层中,我正在对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;
}
Run Code Online (Sandbox Code Playgroud)
然后进入BusinessLayer:
public Task<IList<Product>> GetProducts(string name = null)
{
return _repository.GetProducts(name);
}
Run Code Online (Sandbox Code Playgroud)
最后在MVC控制器中:
public IActionResult Index()
{
Task<IList<Product>> ProductsTask = _manager.GetProducts();
IList<Product> ProductsNonTask = products.Result.ToList();
return View();
}
Run Code Online (Sandbox Code Playgroud)
我是否真的必须让每个函数返回一个类型列表,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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您希望操作实际上是异步的,那么它需要一直异步.
那一刻你块上的Task跟Wait或Result它不再是异步的.
所以不行.要么一直使用异步,要么根本不使用它.
我想知道...如果有一个解决方法,以便我的函数仍然可以返回标准的产品列表,但继续使用HttpClient的异步功能?
不,没有真的.
您应该只是使代码异步,因为它在可伸缩性和性能方面具有许多优点.但如果您反对这样做,您可以使用WebClient具有同步Web操作的方法.
| 归档时间: |
|
| 查看次数: |
1027 次 |
| 最近记录: |