我正在使用System.Net.Http.HttpClient
進行HTTP調用。看來所有的調用都必須是異步的。使用HttpClient時避免從異步函數返回類型任務<Object>
比方說,我有以下的項目結構: MVC Web應用程序 - >業務層 - >數據層
數據層我正在HTTP調用一個Web API返回的數據和我結束使用了這樣的功能:
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<IList<Product>>
一直到我的MVC控制器,或者如果有一個解決方法,以便我的函數仍然可以返回標準列表產品,但繼續使用HttpClient
的異步功能?
UPDATE:這有什麼錯與執行以下操作:
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;
}
}
'執行以下操作有什麼不妥:'是的,代碼不能編譯(出於各種原因)。你可以通過簡單地編譯它來解決這個問題。 – Servy
我很抱歉,由於我複製並粘貼和更改,我無意中將await關鍵字留在了此處。現在已經修復了。 –
由於許多不同的原因,代碼仍然不會編譯。 – Servy