1

Есть ли что-то особенное, которое мне нужно определить в приложении ASP.NET MVC для чтения входящего ответа от веб-API ASP.NET?Нужно ли делать что-то особенное в приложении ASP.NET MVC, чтобы прочитать ответ Json из приложения Web API 2?

Из моего приложения MVC я делаю запрос к веб-API ASP.NET с помощью System.Net.HttpClient. API получает запрос и обрабатывает его и возвращает действительный ответ. Однако приложение MVC, похоже, никогда не получает ответа. У меня есть точка останова на строке, которая делает запрос. Поток управления никогда не возвращается после выполнения этой линии. Приложение MVC просто продолжает ждать и время ожидания после очень долгого времени.

Однако я могу подтвердить, что API возвращает действительный ответ Json. Я пробовал составить этот запрос в Chrome Postman и убедиться, что API возвращает действительный ответ.

Вот код из моего приложения MVC, что делает запрос к Web API:

public async Task<R> PostAsJsonAsync<T, R>(string uri, T value) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(_baseUri); 

     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     var response = await client.PostAsJsonAsync(uri, value); 

     if (response.IsSuccessStatusCode) return await response.Content.ReadAsAsync<R>(); 
     else return default(R); 
    } 
} 

В прошлом, т.е. до Web API 2, я имел MVC приложения поговорить с Web API без каких-либо проблема. Я не знаю, не хватает ли я чего-то, что было введено в Web API 2.

+0

Вы уверены, что ваше приложение WebAPI получает этот запрос? Если вы говорите, что есть тайм-аут, возможно, что-то не так с вашим URL-адресом. Можете ли вы подключиться к своему приложению WebAPI и установить точку останова в методе назначения? Это было сделано? – Eadel

+0

Да, веб-API получает запрос и обрабатывает его правильно и возвращает действительный ответ JSON. Я установил точки останова, а также увидел ответ с Chrome Postman, как упоминалось в вопросе. –

+0

На самом деле, кажется, вы все делаете правильно ... Я бы дважды проверял, получает ли ваш запрос ваш запрос. Вы можете указать Chrome Postman с правильным URL-адресом, в то время как в коде у вас есть другой. Вы также можете попробовать, например, Fiddler или Wireshark, и посмотреть, где именно вы запрашиваете, и что находится в ответе. – Eadel

ответ

0

У меня такое чувство, что вы зашли в тупик. Вы используете .Result где угодно? Вы должны использовать async полностью. Я имею в виду, что ваш метод действия MVC также должен быть async, и они должны await и не использовать .Result. Прочтите эту запись журнала Стивеном Клири для получения дополнительной информации. http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html