2015-05-19 10 views
12

मेरे पास एएसपीनेट एमवीसी वेबसाइट है जो इसके डेटा प्राप्त करने के लिए एक अतिरिक्त एपीआई का उपभोग कर रही है। मैं अनुरोध करने के लिए एसिंक्रोनस कार्यों का उपयोग कर रहा हूं क्योंकि प्रत्येक पृष्ठ पर कई लोग हो सकते हैं। अपटाइम के कुछ समय बाद वेबसाइट डेटा प्राप्त करने का प्रयास करते समय निम्न त्रुटि फेंक रही है।HttpClient.GetAsync को कॉल करने में त्रुटि: अंतर्निहित कनेक्शन बंद किया गया था

अंतर्निहित कनेक्शन बंद था: प्रेषण पर एक अनपेक्षित त्रुटि हुई।

मैंने पढ़ा है कि यह web.config पर अधिकतम कनेक्शन सेटिंग्स के कारण हो सकता है लेकिन इसे बढ़ाना बहुत अंतर नहीं लग रहा है।

मैं एपीआई पर लोड को कम करने के लिए कैशिंग का भी उपयोग कर रहा हूं। कार्य कैश किया गया है ताकि परिणाम बाद में उपयोग किया जा सके।

एकमात्र तरीका जिसे मैंने ठीक करने के लिए पाया है वह एप्लिकेशन पूल रीसाइक्लिंग करके है। किसी भी सहायता की सराहना की जाएगी।

/* Code from page_load */ 

var currenciesTask = ApiClient.GetAsync<CurrencyListWrapper>("currencies"); 
var blogArticleTask = ApiClient.GetAsync<BlogArticleListWrapper>("blog/articles", "limit=10"); 
var seoPageTask = ApiClient.GetAsync<SEOPageListWrapper>("seopages"); 

await Task.WhenAll(currenciesTask, blogArticleTask, seoPageTask); 


/* Code from data access later */ 

public class ApiClient : HttpClient 
{ 
    public static Task<T> GetAsync<T>(string operation, string query = null, bool cache = true) 
    { 
    // Check if task is in cache 
    string cacheName = null; 

    if (cache) 
    { 
     cacheName = String.Format("{0}_{1}_{2}", operation, query ?? String.Empty, App.GetLanguage()); 

     var cachedTask = HttpRuntime.Cache[cacheName]; 

     if (cachedTask != null) 
     { 
     return (Task<T>)cachedTask; 
     } 

    } 

    // Get data task 
    var task = GetAsyncData<T>(operation, query); 

    // Add to cache if required 
    if (task != null && cache) 
    { 
     App.AddToCache(cacheName, task); 
    } 

    return task; 
    } 

    public static async Task<T> GetAsyncData<T>(string operation, string query = null) 
    { 
    using (ApiClient client = new ApiClient()) 
    { 
     string url; 

     if (query != null) 
     { 
     url = String.Format("{0}?{1}", operation, query); 
     } 
     else 
     { 
     url = String.Format("{0}", operation); 
     } 

     var response = await client.GetAsync(url); 

     return (await response.Content.ReadAsAsync<T>()); 
    } 
    } 
} 
+0

यह त्रुटि आईआईएस से उत्पन्न होती है। अधिकांश समय यह कुछ विशिष्ट है जो प्रोटोकॉल के साथ गड़बड़ करता है। कारण एसएसएल से संबंधित या फ्रेमवर्क संगतता हो सकते हैं ... ** जोड़े प्रश्न **: ** 1) ** क्या आप एसएसएल का उपयोग कर रहे हैं? ** 2) ** आईआईएस में आपके ऐप पूल का नेट का कौन सा संस्करण उपयोग करता है? –

+0

उत्तर के लिए धन्यवाद। हां हम वेबसाइट पर एसएसएल का उपयोग कर रहे हैं और जिस वेब सेवा से कनेक्ट हो रहा है। एप्लिकेशन पूल .Net v4.0.30319 का उपयोग कर रहा है। – markvpc

+0

अपने प्रमाण पत्र की जांच करें, आईआईएस के साथ आपका प्रमाण पंजीकरण, बाइंडिंग की जांच करें। अगर सब ठीक लग रहा है तो आप प्रमाण को हटाने और पुनः पंजीकरण करने का भी प्रयास कर सकते हैं। मुझे संदेह है कि यह प्रोटोकॉल द्वारा उलझन में है। प्रोटोकॉल की समस्याएं अतिरिक्त हैंडशेक का कारण बनती हैं और ज़ोंबी के लिए लीड का अनुरोध करती हैं। –

उत्तर

3

यह गलत है,

कार्य तो परिणाम कैश किया गया है बाद में इस्तेमाल किया जा सकता।

आपको परिणाम कैश करना है, कार्य नहीं। पहले निष्पादन के अंत में, आपका HttpClient बंद है और जब आप कैश किए गए कार्य को पुनर्प्राप्त करने का प्रयास करते हैं, तो यह काम नहीं करेगा।

public class ApiClient : HttpClient 
{ 
    public static async Task<T> GetAsync<T>(string operation, string query = null, bool cache = true) 
    { 
    // Check if task is in cache 
    string cacheName = null; 

    if (cache) 
    { 
     cacheName = String.Format("{0}_{1}_{2}", operation, query ?? String.Empty, App.GetLanguage()); 

     T cachedResult = (T)HttpRuntime.Cache[cacheName]; 

     if (cachedResult!= null) 
     { 
     return Task.FromResult(cachedResult); 
     } 

    } 

    // Get data task 
    var result = await GetAsyncData<T>(operation, query); 

    // Add to cache if required 
    if (result != null && cache) 
    { 
     App.AddToCache(cacheName, result); 
    } 

    return result; 
    } 

    public static async Task<T> GetAsyncData<T>(string operation, string query = null) 
    { 
    using (ApiClient client = new ApiClient()) 
    { 
     string url; 

     if (query != null) 
     { 
     url = String.Format("{0}?{1}", operation, query); 
     } 
     else 
     { 
     url = String.Format("{0}", operation); 
     } 

     var response = await client.GetAsync(url); 

     return (await response.Content.ReadAsAsync<T>()); 
    } 
    } 
} 
+0

धन्यवाद, मैं कोशिश करूँगा। एक लाइन है जिसे मुझे काम करने के लिए सही करना था। वापसी का इंतजार टास्क। फ्रॉम रिसेट (कैश रेसल्ट); – markvpc

0

आकाश सही हो सकता है। लेकिन यह एप्लिकेशन पूल के साथ कम या कम कनेक्शन समस्या प्रतीत होता है। एप्लिकेशन पूल पर असीमित बनाने के लिए कनेक्शन सीमा 0 सेट करें। है एक अंत में आप कोड में ब्लॉक, और

gc.collect(); 

कचरा संग्रहण विधि अन्य कनेक्शन के लिए जगह बनाने के लिए अप्रयुक्त कनेक्शन हटाने के लिए कहा जाता है।

+0

धन्यवाद, एप्लिकेशन पूल पर कनेक्शन सीमा पहले ही 0 पर सेट है। मैं कचरा संग्रह की जांच करूंगा। – markvpc

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

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