2015-10-20 7 views
8

मैं HttpClient कक्षा .NET 4.5.2 ढांचे में उपयोग कर रहा हूं। मैं एक थर्ड पार्टी वेब सेवा में PostAsync कर रहा हूं। इस पोस्ट का 80% समय काम करता है, 20% बार जब हमारी प्रतिक्रिया कम हो जाती है।System.Net.Http.HttpRequestException त्रुटि स्ट्रीम में सामग्री को कॉपी करते समय

System.Net.Http.HttpRequestException: त्रुटि एक स्ट्रीम में सामग्री को कॉपी करते हुए इस स्थिति में हम निम्न अपवाद मिलता है। ---> System.IO.IOException: परिवहन कनेक्शन से डेटा पढ़ने में असमर्थ: एक मौजूदा कनेक्शन को दूरस्थ होस्ट द्वारा जबरन बंद कर दिया गया था। ---> System.Net.Sockets.SocketException: मौजूदा कनेक्शन सिस्टम.Net.Sockets.NetworkStream.BeginRead (बाइट [] बफर, Int32 ऑफ़सेट, Int32 आकार, AsyncCallback कॉलबैक पर रिमोट होस्ट द्वारा जबरन बंद कर दिया गया था, ऑब्जेक्ट स्टेट) --- आंतरिक अपवाद स्टैक ट्रेस --- सिस्टम.Net.Sockets.NetworkStream.BeginRead (बाइट [] बफर, Int32 ऑफ़सेट, Int32 आकार, AsyncCallback कॉलबैक, ऑब्जेक्ट स्टेट) सिस्टम पर। Net.FixedSizeReader.StartReading() System.Net.Security._SslStream.StartFrameHeader पर (बाइट [] बफर, Int32 ऑफसेट, Int32 गिनती, AsyncProtocolRequest asyncRequest) System.Net.Security._SslStream.StartReading पर (बाइट [] बफर , Int32 ऑफ़सेट, Int 32 गिनती, AsyncProtocolRequest asyncRequest) System.Net.Security._SslStream.ProcessRead (बाइट [] बफर पर, Int32 ऑफसेट, Int32 गिनती, AsyncProtocolRequest asyncRequest) System.Net.TlsStream.BeginRead (बाइट [] बफर पर, Int32 ऑफसेट , Int32 आकार, asyncCallback asyncCallback, System.Net.ConnectStream.BeginReadWithoutValidation पर asyncState) (बाइट [] बफर, Int32 ऑफसेट, Int32 आकार, asyncCallback कॉलबैक, राज्य वस्तु) System.Net.ConnectStream.BeginRead पर (बाइट वस्तु [] बफर, Int32 ऑफसेट, Int32 आकार, AsyncCallback कॉलबैक, ऑब्जेक्ट स्टेट) सिस्टम.Net.Http.HttpClientHandler.WebExceptionWrapperStream.BeginRead (बाइट [] बफर, Int32 ऑफसेट, Int32 गिनती, AsyncCallback कॉलबैक, System.Net.Http.StreamToStreamCopy.StartRead पर राज्य)()

परवर्ती समान अनुरोध सफल होता है वस्तु। यह एक अनुरोध नहीं है जिसे हम पुनः प्रयास कर सकते हैं क्योंकि व्यवसाय पहले से ही रखा जा चुका है। तो यह हमें एक अजीब स्थिति में छोड़ देता है।

using (var httpClient = new HttpClient()) 
{ 
    httpClient.DefaultRequestHeaders.Authorization = authorizationHeader; 
    HttpContent httpContent = new StringContent(someXml); 

    //Exception occurs on next line... 
    var response = await httpClient.PostAsync("https://thirdpartyendpoint", httpContent); 
    var responseXml = await response.Content.ReadAsStringAsync(); 
    //convert to Dto    
} 

तृतीय पक्ष सेवा सफलतापूर्वक अपने डेटाबेस के लिए रिकॉर्ड बचत कर रहे हैं और उनके अंत में किसी भी स्पष्ट अपवाद नहीं दिख रहा है:

यह मेरा कोड है। उन्होंने ध्यान दिया कि सफल अनुरोधों के मुकाबले डेटाबेस में लिखने के लिए असफल अनुरोधों में आम तौर पर (लगभग 18-30 सेकंड) लगते थे।

आपकी मदद के लिए

ठनक

+0

के बजाय इस HTTP हेडर

Connection: close 

जोड़ने का प्रभाव पड़ता है लगता है एक अवरुद्ध ऑपरेशन या अपने डाटाबेस में बुरा अनुक्रमित है। डेटाबेस क्वेरीज प्रोफाइल करने या डीबी ताले की निगरानी करने का प्रयास करें। –

+0

अतिरिक्त रोमन के बावजूद हाय रोमन, वे अपने कोड में अपवाद नहीं उठाते हैं और वे प्रतिक्रिया पूरी करते हैं। हम बस इसे प्राप्त नहीं करते हैं। – jonho

+1

वे अपने पक्ष में HTTP कनेक्शन टाइमआउट की जांच करेंगे। –

उत्तर

10

हम 2 कोड में परिवर्तन के साथ इस समस्या का समाधान:

  1. httpResponseMessage की समाप्ती और सिर्फ एक सरल डीटीओ

    using (var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage)) 
        { 
         return await CreateDto(httpResponseMessage); 
        } 
    
  2. डाउनग्रेड संस्करण के साथ काम HTTP के v1 के लिए।0

    var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(url)) 
    { 
        Version = HttpVersion.Version10, 
        Content = httpContent 
    }; 
    
    await client.SendAsync(httpRequestMessage); 
    

जो इस

Connection: keep-alive 
+0

httpClient को HttpVersion को कैसे लागू करें के बारे में कोई विचार अनुरोध प्राप्त करते हैं? – garenyondem

+1

var httpRequestMessage = new HttpRequestMessage (HttpMethod.Get, new Uri (url)) { संस्करण = HttpVersion.Version10, सामग्री = httpContent }; क्लाइंट का इंतजार करें। SendAsync (httpRequestMessage); इसे करना चाहिए – jonho

+0

मेरे लिए काम किया। धन्यवाद –

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