2012-12-04 32 views
8

मेरे पास Azure (WebRole) पर होस्ट किया गया डब्ल्यूसीएफ है। वह डब्ल्यूसीएफ बहुत सारे पृष्ठभूमि कार्यों और कुछ याचिकाओं के जवाब देता है।Azure WebRole पर एक डब्ल्यूसीएफ ऑटोस्टार्ट

समस्या यह है कि यदि डब्ल्यूसीएफ को लंबे समय तक कोई याचिका नहीं मिलती है (10 घंटे या उससे अधिक) आवेदन पूल को अज़ूर इंस्टेंस पर पुनर्नवीनीकरण किया जाता है और डब्ल्यूसीएफ कार्य बंद हो जाता है। मैंने थोड़ी सी जांच की है कि मैं मशीन.कॉन्फिग को छूने वाली ऑटोस्टार्ट सुविधा को सक्षम कर सकता हूं, लेकिन यह एज़ूर तैनाती के साथ एक विकल्प नहीं है।

क्या मैं web.config के भीतर ऑटोस्टार्ट सक्षम कर सकता हूं या कॉन्फ़िगरेशन फ़ाइलों को तैनात कर सकता हूं?

उत्तर

11

आप अनुप्रयोग पूल को संशोधित करने के WebRole.cs में कुछ कोड जोड़ सकते हैं:

public class WebRole : RoleEntryPoint 
{ 
    public override void Run() 
    { 
     using (var serverManager = new ServerManager()) 
     { 
      var mainSite = serverManager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"]; 
      var mainApplication = mainSite.Applications["/"]; 
      var mainApplicationPool = serverManager.ApplicationPools[mainApplication.ApplicationPoolName]; 
      mainApplicationPool["autoStart"] = true; 
      mainApplicationPool["startMode"] = "AlwaysRunning"; 

      serverManager.CommitChanges(); 
     } 

     base.Run(); 
    } 

    public override bool OnStart() 
    { 
     // For information on handling configuration changes 
     // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357. 

     return base.OnStart(); 
    } 
} 

नोट: उपयोग करने के लिए ServerManager आप की आवश्यकता होगी:

  • संदर्भ C: \ विंडोज \ system32 \ inetsrv \ Microsoft.Web.Administration.dll (या NuGet के माध्यम से उपलब्ध)
  • <Runtime executionContext="elevated" /> में यो वेबरोल तत्व के तहत आपकी सेवा परिभाषा
+0

कॉन्फ़िगरेशन फ़ाइल के साथ ऐसा करने का कोई मौका? – Jordi

+0

मेरे पास मेरी प्रोजेक्ट पर WebRole.cs नहीं है लेकिन मैंने इसे global.asax के Application_Start पर करने का प्रयास किया। कोड एक अपवाद उठाता है: उपयोगकर्ता कोड द्वारा अनधिकृत एक्सेस अपवाद को अनचाहे किया गया था। फ़ाइल नाम: redirection.config। त्रुटि: अपर्याप्त अनुमतियों के कारण कॉन्फ़िगरेशन फ़ाइल नहीं पढ़ी जा सकती – Jordi

+3

बस अपनी वेब भूमिका में WebRole.cs फ़ाइल जोड़ें। यह भी सुनिश्चित करें कि आप WebRole तत्व के तहत अपनी सेवा परिभाषा में निम्नलिखित तत्व '<रनटाइम निष्पादन Context = "elevated" /> 'जोड़ते हैं। एप्लिकेशन_स्टार्ट आईआईएस में चलने वाले वेब एप्लिकेशन का हिस्सा है, आपको वहां से आईआईएस में बदलाव नहीं करना चाहिए। –

3

जबकि सैंड्रिनो का समाधान काम कर सकता है ... यहां एक ऐसा समाधान है जिसे उन्नत सुरक्षा मोड में चलाने के लिए वेब भूमिका की आवश्यकता नहीं होती है, और यह भी लागू होगा कि जब वेबोलोल शुरू होता है (पहले उपयोगकर्ता साइट पर जाता है)। यह समाधान आईआईएस/विंडोज सर्वर के पुराने संस्करणों पर भी काम करेगा, जिसमें आईआईएस 8 की "एप्लिकेशन प्रारंभिकरण" सुविधा की आवश्यकता नहीं है।

बस निम्नलिखित सामग्री के साथ एक WebRole.cs जोड़ें:

using System; 
using System.Net; 
using System.Net.Security; 
using System.Threading; 
using Microsoft.WindowsAzure.ServiceRuntime; 

namespace Website 
{ 
    public class WebRole : RoleEntryPoint 
    { 
     public override bool OnStart() 
     { 
      WarmUpWebsite("HttpIn"); 
      return base.OnStart(); 
     } 

     public override void Run() 
     { 
      while (true) 
      { 
       WarmUpWebsite("HttpIn"); 
       Thread.Sleep(TimeSpan.FromMinutes(1)); 
      } 
     } 

     public void WarmUpWebsite(string endpointName) 
     { 
      // Disable check for valid certificate. On som sites live HTTP request are redirected to HTTPS endpoint. And when running on staging SSL the certificate is invalid. 
      RemoteCertificateValidationCallback allowAllCertificatesCallback = (sender, certificate, chain, sslPolicyErrors) => true; 
      ServicePointManager.ServerCertificateValidationCallback += allowAllCertificatesCallback; 
      try 
      { 
       RoleInstanceEndpoint endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints[endpointName]; 

       string address = String.Format("{0}://{1}:{2}", endpoint.Protocol, endpoint.IPEndpoint.Address, endpoint.IPEndpoint.Port); 

       //This will cause Application_Start in global.asax to run 
       new WebClient().DownloadString(address); 
      } 
      catch (Exception) 
      { 
       // intentionally swallow all exceptions here. 
      } 
      ServicePointManager.ServerCertificateValidationCallback -= allowAllCertificatesCallback; 
     } 
    } 
} 

क्रेडिट को जाता है: http://weblogs.thinktecture.com/cweyer/2011/01/poor-mans-approach-to-application-pool-warm-up-for-iis-in-a-windows-azure-web-role.html

जबकि (सही) Sandrino के दृष्टिकोण के साथ प्रतिस्थापित किया जा सकता है या आप पूल आवेदन निष्क्रिय समयबाह्य अक्षम कर सकते हैं : http://blog.smarx.com/posts/controlling-application-pool-idle-timeouts-in-windows-azure

+0

मैं इसे अगले अवसर में आज़माउंगा। धन्यवाद – Jordi

+0

यह मेरी वेब भूमिका को 20 मिनट की गतिविधि के बाद सोने में जाने में मदद करता है, लेकिन प्रारंभिक स्टार्टअप में मदद नहीं करता है, या बाद में पुनरारंभ होता है जब भूमिका 2 9 घंटों के बाद पुनर्नवीनीकरण की जाती है। पहली हिट में फिर से लगभग 50 सेकंड लगते हैं। – p10ben