Wykonuję połączenia HTTP za pomocą System.Net.Http.HttpClient
. Wygląda na to, że wszystkie połączenia muszą być asynchroniczne.Unikaj zwracania typu Zadanie <Object> z funkcji asynchronicznej podczas korzystania z HttpClient
Powiedzmy mam strukturę projektu z następujących czynności: MVC Web App -> warstwy biznesowej -> Warstwa danych
w warstwie danych Robię HTTP wywołania API Web, aby powrócić danych i kończę przy użyciu funkcji takich jak to:
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;
}
to następnie przechodzi do BusinessLayer:
public Task<IList<Product>> GetProducts(string name = null)
{
return _repository.GetProducts(name);
}
wreszcie w kontroler MVC:
public IActionResult Index()
{
Task<IList<Product>> ProductsTask = _manager.GetProducts();
IList<Product> ProductsNonTask = products.Result.ToList();
return View();
}
Czy naprawdę muszę zrobić każda funkcja zwraca listę typu Task<IList<Product>>
prowadzącej do mojego kontrolera MVC? Jak widać w kontrolerze MVC, muszę najpierw pobrać produkty z Zawijanym Zadaniem. Debugger wygląda trochę dziwnie, kiedy przejdę do przeglądania listy produktów za jego pośrednictwem. Więc jak widzisz, zamieniam je na regularną listę produktów.
Zastanawiam się, czy to jest właściwe, aby wszystkie funkcje zwracały typ Task<IList<Product>>
do mojego kontrolera MVC lub jeśli istnieje obejście, aby moje funkcje mogły nadal zwracać standardową listę ale nadal używasz asynchronicznych możliwości urządzenia HttpClient
?
UPDATE: Czy jest coś złego w następujący sposób:
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;
}
}
'Czy jest coś złego w wykonywaniu następujących czynności:' Tak, kod nie jest kompilowany (z wielu różnych powodów). Mogłeś to wymyślić, po prostu próbując go skompilować. – Servy
Przepraszam Przypadkowo zostawiłem oczekujące słowo kluczowe od momentu skopiowania, wklejenia i zmiany. Zostało to teraz naprawione. –
Kod nadal nie będzie się kompilować, z wielu różnych powodów. – Servy