2012-12-27 75 views
2

我使用ServerManager来远程管理应用程序站点和应用程序池。但是没有方法来控制或查询实际应用程序的状态。如何通过C#启动/停止/查询iis应用程序(不是网站,而不是应用程序池)?

IIS Manager Context Menu

我有代码的应用程序池

public string StopAppPool(string poolName) 
{ 
     using (var iis = ServerManager.OpenRemote(this._server)) 
     { 
      return iis.ApplicationPools.First(ap => ap.Name == poolName).Stop().ToString(); 
     } 
} 

和现场

public string StartSite(string site) 
{ 
     using(var iis = ServerManager.OpenRemote(this._server)) 
     { 
      return iis.Sites.First(s => s.Name == site).Start().ToString(); 
     } 
} 

,但应用水平不具备这些方法都没有。

public string StartApp(string site,string path) 
{ 
     using (var iis = ServerManager.OpenRemote(this._server)) 
     { 
      iis.Sites[0].Applications[0]. // not here =(
     } 
} 
+1

可能的重复http://stackoverflow.com/questions/1148511/is-it-possible-to-start-stop-an-application-pool-or-website-in-iis-programatic?rq=1 –

+0

@RuiJarimba:不是那种感觉。这是应用程序特定的。 – NotMe

回答

0

您可能需要阅读以下内容:http://www.iis.net/configreference/system.applicationhost/applicationpools

“应用”只运行只要请求是活动的,由于如何在Web工程。因此,除非有长时间运行的线程,否则它只在当前正在处理请求时才有效。如果您需要检查这一点,您可以使用一些WMI功能来获取活动请求的数量。但是,仅仅因为某个特定应用程序当前不处理请求并不意味着它不可用于这样做。

本质上,一个请求进入和IIS本身内开始关闭。 IIS然后查找该请求的处理程序并将其传递到正确的站点/应用程序池。如果您使用的是集成模式或经典模式,但存在细微差异,但对于这些问题无关紧要。

如果它被关闭,或者如果它的应用程序池关闭的网站可能是无效的。提供了这种级别的粒度,以便您可以在多个站点之间共享应用程序池,并允许某些站点处于打开状态,而其他站点处于关闭状态或一次关闭应用程序池中的所有站点。

在一个给定的网站,本身始终启用提供的网站启用应​​用程序,所以没有办法控制特定的应用程序是否开启或关闭整个网站被打开或关闭的范围之外。

如果您需要关闭特定的应用,那么你应该将它们分成不同的网站,并在该水平控制它们。

+0

根据提供的截图中的IIS管理器,您可以在站点中启动/停止应用程序。 – Maslow

+0

@maslow:在屏幕截图中,他们混合使用术语“站点”和“应用程序”以方便阅读。大多数人不会想到他们认为“wcf应用程序”或“wcf服务”的“wcf网站”。然而,从IIS的角度来看,“WCF应用程序”只是另一个网站。 – NotMe

+0

好的,但你可以停止应用程序,而'网站'的其余部分继续发挥作用。所以无论条款是什么,我仍然希望能够在这个粒度级别上开始/停止。 – Maslow

相关问题