2012-05-30 7 views
6

क्रैश मैं किसी वेब एप्लिकेशन, कि बाहरी सेवाओं के डेटा का हो जाता है मिल गया है। अनुरोध स्वयं नीचे दिए गए कोड की तरह होता है - जहां तक ​​मैं देख सकता हूं उतना सरल है। एक अनुरोध बनाएं, इसे अतुल्यकालिक रूप से दूर करें और कॉलबैक को प्रतिक्रिया को संभालने दें। मेरे देव पर्यावरण पर ठीक काम करता है।Async webrequest बार बाहर => आईआईएस

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 तक नहीं पहुंच सकता है। ठीक है, मैंने सोचा - एक अनुरोध टाइमआउट वास्तव में किसी को चोट नहीं पहुंचाएगा। हालांकि, ऐसा लगता है कि हर बार जब यह अनुरोध समाप्त हो गया, एएसपी.नेट दुर्घटनाग्रस्त हो गया और आईआईएस फिर से शुरू हो गया। ईवेंट लॉग मुझे अन्य बातों के अलावा, इस स्टैकट्रेस पता चलता है:

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) 

यह ..so सब एक SocketException करने पर निर्भर करता है, यह मुझे लगता है। और सही बाद में एक और घटना (जो मेरा अनुमान है कि प्रासंगिक है) (एक ही सेकंड के भीतर) लॉग होता है:

Exception Info: System.AggregateException 
Stack: 
    at System.Threading.Tasks.TaskExceptionHolder.Finalize() 

इस तरह मुझे परे की है के रूप में मैं async कोड और सूत्रण का कोई मास्टर हूँ, लेकिन है कि वेब अनुरोधों से एक टाइमआउट आईआईएस को दुर्घटनाग्रस्त होने का कारण बनता है बहुत अजीब लगता है। मैं MakeRequest reimplemented तुल्यकालिक अनुरोध पर कार्रवाई करने, जो बाहर महान काम करता है। अनुरोध अभी भी उन वातावरणों में समाप्त हो गया है, लेकिन कोई नुकसान नहीं हुआ है और ऐप हमेशा के लिए खुशी से चल रहा है।

तो मैं sortof मेरी समस्या हल है, लेकिन क्यों होता है? क्या कोई मुझे प्रबुद्ध कर सकता है? :-)

उत्तर

12

आपका निरंतरता तथ्य यह है कि .Result एक अपवाद को प्रतिबिंबित हो सकता है संभाल करने की जरूरत है। अन्यथा आपके पास एक अनचाहे अपवाद है। अनचाहे अपवाद प्रक्रियाओं को मार देते हैं। नहीं कॉलबैक -

.ContinueWith(task => 
{ 
    try { 
     WebResponse response = task.Result; 
     Stream responseStream = response.GetResponseStream(); 
     responseCallback(responseStream); 
     responseStream.Close(); 
     response.Close(); 
    } catch(Exception ex) { 
     // TODO: log ex, etc 
    } 
}); 

अपने वर्ष अपवाद संचालक केवल काम की निर्माण शामिल किया गया।

+0

आह, तो व्याख्या यह है कि सरल है। तुरंत चाल चलने के लिए माना जाता है। बहुत बड़ा धन्यवाद! अब, उन बर्बाद घंटे वापस कैसे प्राप्त करें ... –

संबंधित मुद्दे