2008-10-30 16 views

उत्तर

49

जॉन,

आप IIS7 पर हैं तो यह यह करना होगा, अगर इसे बंद कर दिया जाता है। मुझे लगता है कि आप दिखाए बिना पुनरारंभ करने के लिए समायोजित कर सकते हैं।

// Gets the application pool collection from the server. 
[ModuleServiceMethod(PassThrough = true)] 
public ArrayList GetApplicationPoolCollection() 
{ 
    // Use an ArrayList to transfer objects to the client. 
    ArrayList arrayOfApplicationBags = new ArrayList(); 

    ServerManager serverManager = new ServerManager(); 
    ApplicationPoolCollection applicationPoolCollection = serverManager.ApplicationPools; 
    foreach (ApplicationPool applicationPool in applicationPoolCollection) 
    { 
     PropertyBag applicationPoolBag = new PropertyBag(); 
     applicationPoolBag[ServerManagerDemoGlobals.ApplicationPoolArray] = applicationPool; 
     arrayOfApplicationBags.Add(applicationPoolBag); 
     // If the applicationPool is stopped, restart it. 
     if (applicationPool.State == ObjectState.Stopped) 
     { 
      applicationPool.Start(); 
     } 

    } 

    // CommitChanges to persist the changes to the ApplicationHost.config. 
    serverManager.CommitChanges(); 
    return arrayOfApplicationBags; 
} 

आप IIS6 पर हैं, तो मैं इतना यकीन नहीं है, लेकिन आप web.config हो रही है और संपादन संशोधित तिथि या कुछ और की कोशिश कर सकते। एक बार वेब.कॉन्फिग में एक संपादन किया जाता है तो एप्लिकेशन पुनरारंभ होगा।

+3

ओह, आगे बढ़ें और उसे पुनरारंभ करने के लिए समायोजित करने के तरीके को दिखाएं। क्या आपको पता है इसे कैसे किया जाता है? – DOK

+0

+1 आप आदमी हैं। 10 से कम समाधान (वेब.कॉन्फिग को छूने सहित) के बाद, यह विंटर था। – ashes999

+3

हाय, यह एक बहुत पुरानी पोस्ट है लेकिन मैं एक भाग को समझने के लिए संघर्ष कर रहा हूं। "ServerManagerDemoGlobals.AplicationPoolArray" कहां से आता है? यानी मुझे इसका उपयोग करने के लिए क्या संदर्भ देना चाहिए? मैंने माइक्रोसॉफ्ट.Web.Management.dll और माइक्रोसॉफ्ट.Web.Administration.dll के संदर्भों को जोड़ा है धन्यवाद – Jon

5

रीसायकल कोड IIS6 पर काम कर रहा:

/// <summary> 
    /// Get a list of available Application Pools 
    /// </summary> 
    /// <returns></returns> 
    public static List<string> HentAppPools() { 

     List<string> list = new List<string>(); 
     DirectoryEntry W3SVC = new DirectoryEntry("IIS://LocalHost/w3svc", "", ""); 

     foreach (DirectoryEntry Site in W3SVC.Children) { 
      if (Site.Name == "AppPools") { 
       foreach (DirectoryEntry child in Site.Children) { 
        list.Add(child.Name); 
       } 
      } 
     } 
     return list; 
    } 

    /// <summary> 
    /// Recycle an application pool 
    /// </summary> 
    /// <param name="IIsApplicationPool"></param> 
    public static void RecycleAppPool(string IIsApplicationPool) { 
     ManagementScope scope = new ManagementScope(@"\\localhost\root\MicrosoftIISv2"); 
     scope.Connect(); 
     ManagementObject appPool = new ManagementObject(scope, new ManagementPath("IIsApplicationPool.Name='W3SVC/AppPools/" + IIsApplicationPool + "'"), null); 

     appPool.InvokeMethod("Recycle", null, null); 
    } 
7

नीचे दिया गया कोड आईआईएस 6 पर काम करता है। आईआईएस 7 में परीक्षण नहीं किया गया।

using System.DirectoryServices; 

... 

void Recycle(string appPool) 
{ 
    string appPoolPath = "IIS://localhost/W3SVC/AppPools/" + appPool; 

    using (DirectoryEntry appPoolEntry = new DirectoryEntry(appPoolPath)) 
    { 
      appPoolEntry.Invoke("Recycle", null); 
      appPoolEntry.Close(); 
    } 
} 

आप "स्टार्ट" या "स्टॉप" के लिए भी "रीसायकल" बदल सकते हैं।

+0

http://stackoverflow.com/q/511263/#1762770 के अनुसार, यह आईआईएस 7 में भी काम करता है। –

+4

ध्यान दें कि आपको आईआईएस 7 – Gabriel

76

ये हम चले:

HttpRuntime.UnloadAppDomain(); 
+12

पर सक्षम "आईआईएस 6 डब्लूएमआई संगतता" की आवश्यकता है जो एप्लिकेशन को रीसायकल करता है, लेकिन मुझे यकीन नहीं है कि यह पूरे ऐप-पूल को रीसायकल करता है (जो एक साथ कई एप्लिकेशन होस्ट कर सकता है)। –

+0

@Marc - बहुत मान्य, हालांकि कभी-कभी आप केवल वर्तमान एप्लिकेशन संदर्भ की परवाह करते हैं। रीलोड करने की आवश्यकता को इंगित करने वाली स्थितियां प्रत्येक उदाहरण में स्वतंत्र रूप से जोर दे सकती हैं। –

+1

बहुत उपयोगी, मुझे इसकी आवश्यकता है! (मुझे केवल वर्तमान संदर्भ के लिए इसकी आवश्यकता है) –

1

कभी-कभी मुझे लगता है कि सरल सबसे अच्छा है। - और जब मेरा सुझाव है कि एक कुछ चालाक तरह से वास्तविक पथ adapts अन्य enviorments पर एक व्यापक रास्ते पर काम करने के लिए मेरे समाधान तरह दिखता है:

ExecuteDosCommand(@"c:\Windows\System32\inetsrv\appcmd recycle apppool " + appPool); 

सी # से, एक डॉस कमांड कि काम कर देता है चलाते हैं। उपरोक्त कई समाधान विभिन्न सेटिंग्स पर काम नहीं करते हैं और/या चालू होने के लिए विंडोज़ पर सुविधाओं की आवश्यकता होती है (सेटिंग के आधार पर)।

+0

यह विशेष रूप से यदि आपके पास अन्य समाधानों में से किसी एक को कोशिश करने से अज्ञात त्रुटि 0x80005000 है। यह सब अपने तरीके से अच्छा है। –

+1

मैं आपको अपनी 'ExecuteDosCommand' विधि बनाने के तरीके पर अनुशंसा करता हूं। http://www.codeproject.com/Articles/25983/How-to-Execute-a-Command-in-C –

+0

यदि आप इसे रिमोट सर्वर पर चला रहे हैं तो आप उपरोक्त आदेश कैसे चलाएंगे? – Baahubali

6

मैं अपने पूल के साथ एप्लिकेशन पूल रीसायकल करने के लिए थोड़ा अलग मार्ग चला गया। कुछ चीजों को ध्यान में रखना जो दूसरों ने प्रदान किए हैं उससे अलग हैं:

1) मैंने सर्वरमैनेजर ऑब्जेक्ट का उचित निपटान सुनिश्चित करने के लिए एक उपयोग कथन का उपयोग किया।

2) मैं एप्लिकेशन पूल को रोकने से पहले इसे खत्म करने की प्रतीक्षा कर रहा हूं, ताकि हम एप्लिकेशन को रोकने की कोशिश करने के साथ किसी भी समस्या में भाग न सकें। इसी तरह, मैं ऐप पूल को शुरू करने की कोशिश करने से पहले इसे रोकने के लिए इंतजार कर रहा हूं।

3) मैं स्थानीय सर्वर पर वापस आने के बजाय वास्तविक सर्वर नाम स्वीकार करने की विधि को मजबूर कर रहा हूं, क्योंकि मुझे लगा कि आपको शायद यह पता होना चाहिए कि आप किस सर्वर के खिलाफ इसे चला रहे हैं।

4) मैंने इसे रीसाइक्लिंग के विरोध में एप्लिकेशन को शुरू/बंद करने का निर्णय लिया, ताकि मैं यह सुनिश्चित कर सकूं कि हमने किसी अन्य कारण से बंद कर दिया गया एप्लिकेशन पूल गलती से शुरू नहीं किया है, और कोशिश करने के साथ समस्याओं से बचने के लिए पहले से ही एक बंद आवेदन पूल रीसायकल।

public static void RecycleApplicationPool(string serverName, string appPoolName) 
{ 
    if (!string.IsNullOrEmpty(serverName) && !string.IsNullOrEmpty(appPoolName)) 
    { 
     try 
     { 
      using (ServerManager manager = ServerManager.OpenRemote(serverName)) 
      { 
       ApplicationPool appPool = manager.ApplicationPools.FirstOrDefault(ap => ap.Name == appPoolName); 

       //Don't bother trying to recycle if we don't have an app pool 
       if (appPool != null) 
       { 
        //Get the current state of the app pool 
        bool appPoolRunning = appPool.State == ObjectState.Started || appPool.State == ObjectState.Starting; 
        bool appPoolStopped = appPool.State == ObjectState.Stopped || appPool.State == ObjectState.Stopping; 

        //The app pool is running, so stop it first. 
        if (appPoolRunning) 
        { 
         //Wait for the app to finish before trying to stop 
         while (appPool.State == ObjectState.Starting) { System.Threading.Thread.Sleep(1000); } 

         //Stop the app if it isn't already stopped 
         if (appPool.State != ObjectState.Stopped) 
         { 
          appPool.Stop(); 
         } 
         appPoolStopped = true; 
        } 

        //Only try restart the app pool if it was running in the first place, because there may be a reason it was not started. 
        if (appPoolStopped && appPoolRunning) 
        { 
         //Wait for the app to finish before trying to start 
         while (appPool.State == ObjectState.Stopping) { System.Threading.Thread.Sleep(1000); } 

         //Start the app 
         appPool.Start(); 
        } 
       } 
       else 
       { 
        throw new Exception(string.Format("An Application Pool does not exist with the name {0}.{1}", serverName, appPoolName)); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(string.Format("Unable to restart the application pools for {0}.{1}", serverName, appPoolName), ex.InnerException); 
     } 
    } 
} 
+1

मेरे iis8 पर अच्छा काम करता है, त्रुटि मुक्त संदर्भ के रूप में संदर्भ Microsoft.Web.Administration जोड़ने की जरूरत है। – sairfan

0

यह कोड मेरे लिए काम करता है। बस इसे पुनः लोड करने के लिए कॉल करें।

System.Web.HttpRuntime.UnloadAppDomain() 
संबंधित मुद्दे