2012-06-21 18 views
12

मैं आईआईएस 7.5 पर एक वेब ऐप चला रहा हूं और इसे कभी-कभी रीसायकल करने की ज़रूरत होती है (अन्यथा स्मृति उपयोग सौंपने से बाहर हो जाता है, जो कुछ मैं देख रहा हूं!)।आईआईएस ऐप पूल रीसायकल + क्वार्ट्ज शेड्यूलिंग

जब यह रीसायकल करता है, तब तक प्रभावी रूप से तब तक नहीं चल रहा है जब तक कोई अन्य अनुरोध नहीं आता है, जो क्वार्ट्ज नहीं चल रहा है।

क्या क्वार्ट्ज हमेशा ऑनलाइन सुनिश्चित करने के लिए ऐप पूल रीसाइक्लिंग के तुरंत बाद आईआईएस स्वचालित रूप से 1 कार्य प्रक्रिया लाने का कोई तरीका है?

+0

क्या आप इसके बजाय विंडोज सेवा में क्वार्ट्ज होस्ट नहीं करना चाहिए? –

+0

@ जकूबकोनेकी, यह मेरी योजना बी होगी, ऐप के भीतर इसे होस्ट करने की तुलना में यह और अधिक प्रयास है, क्योंकि शेड्यूलर केवल ऐप के साथ इंटरैक्ट करता है। –

+2

योजना ए होना चाहिए था ;-) http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx –

उत्तर

13

हाँ!

  1. संपादित करें C: \ Windows \ System32 \ inetsrv \ config \ applicationHost.config शामिल करने के लिए:

    <applicationPools> 
        <add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" /> 
    </applicationPools> 
    
  2. घोषित क्या

    http://weblogs.asp.net/scottgu/archive/2009/09/15/auto-start-asp-net-applications-vs-2010-and-net-4-0-series.aspx विवरण यह काफी अच्छी तरह से, मूल रूप से आप की जरूरत है आपकी साइट के लिए "गर्मजोशी" के रूप में चलाया जाना चाहिए

    <sites> 
        <site name="MySite" id="1"> 
         <application path="/" serviceAutoStartEnabled="true" serviceAutoStartProvider="PreWarmMyCache" /> 
        </site> 
    </sites> 
    <serviceAutoStartProviders> 
        <add name="PreWarmMyCache" type="PreWarmCache, MyAssembly" /> 
    </serviceAutoStartProviders> 
    
  3. आप चाहते हैं जो कुछ भी "वार्म अप" तर्क से अपना एप्लिकेशन कॉन्फ़िगर:

    public class PreWarmCache : System.Web.Hosting.IProcessHostPreloadClient { 
        public void Preload(string[] parameters) { 
         // Perform initialization and cache loading logic here... 
        } 
    } 
    

नोट: यदि आप सभी की जरूरत है w3wp.exe प्रक्रिया वर्तमान मेरा मानना ​​है कि केवल चरण 1 आवश्यक है होने के लिए। यदि आपको अन्य वस्तुओं की भी आवश्यकता है (जैसे कुछ चीजों को स्मृति में लोड किया जाना चाहिए) तो चरण 2 और 3 का भी उपयोग किया जाएगा।

+0

एक पुराना विषय बंपिंग के लिए खेद है, लेकिन जहां यह गर्म वर्ग एमवीसी 4 परियोजना में स्थित होना चाहिए? –

+0

@ स्टीफेंस।धन्यवाद लेकिन यह मेरे लिए काम नहीं किया गया है [रीसाइक्लिंग या पुनरारंभ करने के बाद आईआईएस पर जीवित वेब एप्लिकेशन नहीं रख सकता] [http://stackoverflow.com/questions/33593602/cannot-keep-alive-web-plication-on-iis -After-रीसाइक्लिंग या पुनरारंभ)। कोई मदद pls? –

+0

मेरे जैसे अन्य लोगों के लिए जो नोटपैड ++ या अन्य संपादक को एप्लिकेशनहोस्ट.कॉन्फिग संपादित करने का प्रयास करने का प्रयास करते हैं, एसओ पर इस उत्तर में मदद मिली (मूल रूप से, नोटपैड का उपयोग करें): [link] (http://stackoverflow.com/a/13335092/2506135) –

0

मैंने इस समस्या पर एक दरार ली। जबकि Stephen's answer ऐप को स्प्रिंग.Net वातावरण में चल रहा है, ढांचा बंद नहीं होगा और क्वार्ट्ज नहीं चलेगा। मैंने एक साथ IProcessHostPreloadClient का कार्यान्वयन किया है जो सभी मशीनरी चलाने के लिए एप्लिकेशन को वास्तविक अनुरोध को बंद कर देगा। यह भी on my blog पोस्ट किया जाता है:

public class Preloader : System.Web.Hosting.IProcessHostPreloadClient 
{ 
    public void Preload(string[] parameters) 
    { 
     var uris = System.Configuration.ConfigurationManager 
         .AppSettings["AdditionalStartupUris"]; 
     StartupApplication(AllUris(uris)); 
    } 

    public void StartupApplication(IEnumerable<Uri> uris) 
    { 
     new System.Threading.Thread(o => 
     { 
      System.Threading.Thread.Sleep(500); 
      foreach (var uri in (IEnumerable<Uri>)o) { 
       var client = new System.Net.WebClient(); 
       client.DownloadStringAsync(uris.First()); 
      } 
     }).Start(uris); 
    } 

    public IEnumerable<Uri> AllUris(string userConfiguration) 
    { 
     if (userConfiguration == null) 
      return GuessedUris(); 
     return AllUris(userConfiguration.Split(' ')).Union(GuessedUris()); 
    } 

    private IEnumerable<Uri> GuessedUris() 
    { 
     string path = System.Web.HttpRuntime.AppDomainAppVirtualPath; 
     if (path != null) 
      yield return new Uri("http://localhost" + path); 
    } 

    private IEnumerable<Uri> AllUris(params string[] configurationParts) 
    { 
     return configurationParts 
      .Select(p => ParseConfiguration(p)) 
      .Where(p => p.Item1) 
      .Select(p => ToUri(p.Item2)) 
      .Where(u => u != null); 
    } 

    private Uri ToUri(string value) 
    { 
     try { 
      return new Uri(value); 
     } 
     catch (UriFormatException) { 
      return null; 
     } 
    } 

    private Tuple<bool, string> ParseConfiguration(string part) 
    { 
     return new Tuple<bool, string>(IsRelevant(part), ParsePart(part)); 
    } 

    private string ParsePart(string part) 
    { 
     // We expect IPv4 or MachineName followed by | 
     var portions = part.Split('|'); 
     return portions.Last(); 
    } 

    private bool IsRelevant(string part) 
    { 
     var portions = part.Split('|'); 
     return 
      portions.Count() == 1 || 
      portions[0] == System.Environment.MachineName || 
      HostIpAddresses().Any(a => a == portions[0]); 
    } 

    private IEnumerable<string> HostIpAddresses() 
    { 
     var adaptors = System.Net.NetworkInformation 
          .NetworkInterface.GetAllNetworkInterfaces(); 
     return adaptors 
       .Where(a => a.OperationalStatus == 
          System.Net.NetworkInformation.OperationalStatus.Up) 
       .SelectMany(a => a.GetIPProperties().UnicastAddresses) 
       .Where(a => a.Address.AddressFamily == 
          System.Net.Sockets.AddressFamily.InterNetwork) 
       .Select(a => a.Address.ToString()); 
    } 
} 
-3

या आप बस Global.asax में "Application_Start" विधि को संशोधित सुनिश्चित करना है कि Quortz चल रहा है हो सकता है।

+2

एप्लिकेशन_स्टार्ट केवल रीसायकल या स्टार्टअप के बाद पहले अनुरोध के दौरान बुलाया जाता है, यह वांछित व्यवहार नहीं है। –

1

आईआईएस 8.0 से शुरू होने पर रूट पेज पर अनुरोध अनुकरण करने का एक विकल्प है, इस प्रकार एक पूर्ण अनुप्रयोग प्रारंभिकरण: एप्लिकेशन पूल उन्नत सेटिंग्स -> प्रीलोड सक्षम = सत्य।

बेशक, स्टार्टमोड हमेशा चल रहा होना चाहिए।

इस सुविधा को सक्षम करने के तरीके के बारे में अधिक जानकारी here मिल सकती है।

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