2016-12-12 5 views
10

मैं एक स्क्रिप्ट है कि 4mins30seconds के बारे में के लिए चलाता है और मैं अपने aspx वेबपेज के config पेज में 3600 सेकंड के लिए समय डिफ़ॉल्ट टाइमआउट को बदल दिया है500 - अनुरोध की अवधि समाप्त [Updated]

यह वापस नहीं किया था 500 - अनुरोध ने संस्करण संस्करण और आईआईएस 8 पर अपलोड किए गए संस्करण पर त्रुटि का समय समाप्त किया।

हालांकि जब मैंने इसे एज़ूर में लाइव साइट पर अपलोड किया, तो यह 500 लौटाता है - अनुरोध का समय समाप्त हो गया है।

क्या Azure इन सेटिंग्स को ओवरराइट करता है?

कॉन्फिग:

<configuration> 
    <system.web> 
    <httpRuntime executionTimeout="3600" /> 
    <sessionState timeout="360" /> 
    <compilation debug="false" targetFramework="4.0"> 
     <assemblies> 
     <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 
     <add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral/> 
     </assemblies> 
    </compilation> 
    </system.web> 
</configuration> 

संपादित करें:

मैं 3600 मूल्य के साथ नीला आवेदन सेटिंग्स में SCM_COMMAND_IDLE_TIMEOUT जोड़ा लेकिन यह त्रुटि को ठीक नहीं किया था, अब मेरी कोड के प्रदर्शन में सुधार करने की कोशिश कर:

मूल:

Stopwatch stopwatch = new Stopwatch(); 
stopwatch.Start(); 

Dictionary<int, Dictionary<DateTime, float>> d_PhoneNo_DateDataList = new Dictionary<int, Dictionary<DateTime, float>>(); 

string sqlcommand = "SELECT ---- FROM ---- INNER JOIN ---- ON ---- = ---- WHERE [email protected] AND date BETWEEN @Date1 AND @Date2"; 
string strConnectionString = ConfigurationManager.ConnectionStrings["---"].ConnectionString; 

using (SqlConnection conn = new SqlConnection(strConnectionString)) 
{ 
    Dictionary<DateTime, float> d_DateTime_Data; 

    using (SqlCommand cmd = new SqlCommand(sqlcommand, conn)) 
    { 
     cmd.Parameters.Add("@PhoneNo", SqlDbType.Int); 
     cmd.Parameters.AddWithValue("@Date1", dateStart); 
     cmd.Parameters.AddWithValue("@Date2", dateEnd.AddDays(1)); 
     conn.Open(); 

     for (int i = 0; i < phoneNo.Count; i++) 
     { 
      d_DateTime_Data = new Dictionary<DateTime, float>(); 
      cmd.Parameters["@PhoneNo"].Value = phoneNo[i]; 
      cmd.ExecuteNonQuery(); 
      using (SqlDataReader reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        d_DateTime_Data.Add(DateTime.Parse(reader["Date"].ToString()), float.Parse(reader["Data"].ToString())); 
       } 
      } 
      d_PhoneNo_DateDataList.Add(phoneNo[i], d_DateTime_Data); 
     } 
     conn.Close(); 
    } 
} 

मैंने एक संगीत का उपयोग करने की कोशिश की Parallel.For साथ urrentDictionary लेकिन यह DataReader

ConcurrentDictionary<int, Dictionary<DateTime, float>> d_PhoneNo_DateDataList = new ConcurrentDictionary<int, Dictionary<DateTime, float>>(); 

string sqlcommand = "SELECT ---- FROM ---- INNER JOIN ---- ON ---- = ---- WHERE [email protected] AND date BETWEEN @Date1 AND @Date2"; 
string strConnectionString = ConfigurationManager.ConnectionStrings["----"].ConnectionString; 

using (SqlConnection conn = new SqlConnection(strConnectionString)) 
{ 
    Dictionary<DateTime, float> d_DateTime_Data; 

    using (SqlCommand cmd = new SqlCommand(sqlcommand, conn)) 
    { 
     cmd.Parameters.Add("@PhoneNo", SqlDbType.Int); 
     cmd.Parameters.AddWithValue("@Date1", dateStart); 
     cmd.Parameters.AddWithValue("@Date2", dateEnd.AddDays(1)); 
     conn.Open(); 

     Parallel.For(0, phoneNo.Count, (index) => 
     { 
      d_DateTime_Data = new Dictionary<DateTime, float>(); 
      cmd.Parameters["@PhoneNo"].Value = phoneNo[index]; 
      cmd.ExecuteNonQuery(); 
      using (SqlDataReader reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        d_DateTime_Data.Add(DateTime.Parse(reader["Date"].ToString()), float.Parse(reader["Data"].ToString())); 
       } 
      } 
      d_PhoneNo_DateDataList.TryAdd(phoneNo[index], d_DateTime_Data); 
     }); 
     conn.Close(); 
    } 
} 
+0

के लिए विन्यास निष्क्रिय टाइमआउट आप ब्राउज़र में इस त्रुटि मिलती है? या आप इस पेज को दूसरी जगह से बुला रहे हैं? –

+0

मुझे ब्राउज़र में मिला, एक त्रुटि पृष्ठ की तरह –

+0

आपका एप्लिकेशन कैसे तैनात किया गया है? क्या यह एक वेब ऐप के रूप में चल रहा है या वीएम/क्लाउड सेवा के अंदर चल रहा है? –

उत्तर

9

यदि आपके वेब ऐप में कोड का कोई भी टुकड़ा है जो इस लंबे समय तक लेता है तो इसे कम से कम एक वेब नौकरी पर ले जाएं, कम से कम एप्लिकेशन स्केलेबिलिटी पर किसी भी प्रभाव से बचने के लिए।

1- एक वेब नौकरी बनाएं और उस कोड को ले जाएं जो इसे लंबे समय तक लेता है।

2- कतार में आवश्यक विवरण के साथ एक संदेश डालने

4- आप की जरूरत है, उपयोगकर्ता सबमिट करने के बाद वेब नौकरी, एक कतार

3- अपने वेब ऐप्लिकेशन में के लिए सुनने बनाओ प्रक्रिया को पूरा करने के बारे में उपयोगकर्ता को सूचित करें, फिर सिग्नलआर का उपयोग करें, अपनी जावास्क्रिप्ट से हब से कनेक्ट करें, और इसे वेब जॉब कोड से ऊपर एक संदेश पोस्ट करें, यह उपयोगकर्ता को तुरंत सूचित करेगा

6

आप संभवत: 230 सेकंड के अनुप्रयोग सेवा में hardcoded समय समाप्त हो रही है, के साथ मुद्दों पैदा करता है।

अधिक के लिए इस सवाल का देखें: एक WebJob के रूप में है कि लंबे समय से चल रहा है काम है और एक पंक्ति या तालिका के लिए परिणाम पोस्ट करने के लिए
Azure ASP .net WebApp The request timed out

प्रयास करें। या एक टेबल/ब्लॉब पर पोस्ट करें (शायद यदि आप डेटा का पुन: उपयोग कर रहे हैं तो भी रेडिस) और एक कतार संदेश के साथ सिग्नल करें।

1

हमारे साथ एक ही समस्या थी Azure जब हम एसडीके (2.3) के एक पुराने संस्करण और एक लोड बैलेंसर बनाने webservice कॉल का उपयोग कर रहे थे। यह आपके लिए समान नहीं हो सकता है क्योंकि आप डेटाबेस क्वेरी कर रहे हैं। लोड बैलेंसर के लिए डिफ़ॉल्ट टाइमआउट 4 मिनट है। एसडीके के एक नए संस्करण को अपडेट करना और idleTimeoutInMinutes की एंडपॉइंट सेटिंग का उपयोग टाइमआउट से पहले अधिकतम 30 मिनट (मुझे लगता है) तक की अनुमति देता है।

कार्रवाई:

आप Azure में क्लाउड सेवा होस्ट कर रहे हैं

परिणाम:

आप ग्राहकों है कि आपके क्लाउड सेवा में फोन है, और बादल सेवा कॉल 4 मिनट से अधिक समय लेता है, तो उसके बाद जब तक ग्राहक क्लाइंट साइड टाइमआउट नहीं ले लेते तब तक आपके ग्राहक लटक रहे थे।

कारण: Azure क्लाउड सेवा लोड बैलेंसर में TCP कनेक्शन के

डिफ़ॉल्ट निष्क्रिय समयबाह्य 4 मिनट है।

समाधान:

आप कम से कम 2.4 Azure SDK पर अपग्रेड करने के लिए और फिर तुम कितनी देर तक Azure लोड बैलेंसर जिंदा रहने के लिए इन निष्क्रिय TCP कनेक्शन की सुविधा देता है को नियंत्रित करने के CSDEF फ़ाइल के idleTimeoutInMinutes विशेषता सक्षम कर सकते हैं की आवश्यकता होगी उस कनेक्शन को रीसेट करने से पहले।

<Endpoints> 
    <InputEndpoint name="Endpoint1" protocol="http" port="80" idleTimeoutInMinutes="6" /> 
</Endpoints> 

नई: Azure लोड बैलेंसर http://azure.microsoft.com/blog/2014/08/14/new-configurable-idle-timeout-for-azure-load-balancer/

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