2015-07-06 3 views
2

мне нужно вызвать веб-Апи 3 партии из моего ASP.net Web API, когда он запускает линиюВеб-сервер зависает при вызове 3rd Party Web API из моего Web API

HttpResponseMessage response = await client.PostAsJsonAsync("api/ArTrx/postDocument", poMaster); 

зависания веб-сервера , Я попытался ввести код ниже в консольную программу, он работает хорошо. Что не так с приведенным ниже кодом при запуске в проекте ASP.NET Web API?

client.BaseAddress = new Uri(webAPIAddress); 
client.DefaultRequestHeaders.Accept.Clear(); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

string token = Crypto.EncryptStringAES("abcd1234"); 
client.DefaultRequestHeaders.Add("X-Token", token); 

HttpResponseMessage response = await client.PostAsJsonAsync("api/ArTrx/postDocument", poMaster);  
if (response.IsSuccessStatusCode) 
{ 
    ... 
} 

ответ

2

Вы, вероятно, Task<T>.Result или Task.Wait вызов дальше вашего стека вызовов. Это будет cause a deadlock on ASP.NET, о котором я расскажу более подробно в своем блоге.

Таким образом, await будет захватывать «контекст» - в данном случае контекст запроса ASP.NET, который позволяет одновременно запускать только один поток. Когда его ожидание завершается (то есть, когда POST завершается), метод async продолжит в этом контексте. Если ваш код еще больше блокирует стек вызовов (например, Result или Wait), он блокирует поток в контексте запроса ASP.NET, а метод async не может войти в этот контекст, чтобы продолжить выполнение.

Вы не видите тупик в приложении консоли, потому что контекст не захвачен, поэтому метод async возобновляется в потоке пула потоков.

Смежные вопросы