我有一個web應用程序,它從外部服務獲取數據。請求本身就像下面的代碼一樣發生 - 就我所能看到的而言非常簡單。創建一個請求,將其異步激活並讓回調處理響應。適用於我的開發環境。異步webrequest超時=>崩潰IIS
public static void MakeRequest(Uri uri, Action<Stream> responseCallback)
{
WebRequest request = WebRequest.Create(uri);
request.Proxy = null;
request.Timeout = 8000;
try
{
Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null)
.ContinueWith(task =>
{
WebResponse response = task.Result;
Stream responseStream = response.GetResponseStream();
responseCallback(response.GetResponseStream());
responseStream.Close();
response.Close();
});
} catch (Exception ex)
{
_log.Error("MakeRequest to " + uri + " went wrong.", ex);
}
}
但是,除了我之外,外部測試環境和生產環境可能無法達到目標URL。好吧,我想 - 請求超時不會真的傷害任何人。但是,似乎每次這個請求超時,ASP.NET崩潰並且IIS重新啓動。事件日誌告訴我,除此之外,這堆棧跟蹤:
StackTrace: at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task`1.get_Result()
at MyApp.AsyncWebClient.<>c__DisplayClass2.<MakeRequest>b__0(Task`1 task)
at System.Threading.Tasks.Task`1.<>c__DisplayClass17.<ContinueWith>b__16(Object obj)
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
InnerException: System.Net.WebException
Message: Unable to connect to the remote server
StackTrace: at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endMethod, TaskCompletionSource`1 tcs)
InnerException: System.Net.Sockets.SocketException
Message: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
StackTrace: at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
..所以這一切歸結爲一個SocketException,在我看來。和右後另一個事件(我猜是相關的)(在同一秒內)記錄:
Exception Info: System.AggregateException
Stack:
at System.Threading.Tasks.TaskExceptionHolder.Finalize()
這有點超出了我,我沒有異步代碼和線程的主人,但來自Web請求的超時導致IIS崩潰似乎很奇怪。我重新實現了MakeRequest
同步執行請求,這很好。該請求在這些環境中仍然超時,但沒有造成任何破壞,並且應用程序永遠繼續快樂地運行。
所以我排序解決了我的問題,但爲什麼會發生這種情況?任何人都可以啓發我嗎? :-)
嗯,所以解釋就是這麼簡單。似乎馬上做這個伎倆。非常感謝!現在,如何讓這些浪費時間回來... –