2010-08-17 100 views
6

我的情況:當我在GAC中部署程序集.NET時,出現錯誤(無法訪問xxx.dll,因爲它正在用於其他進程)。 IIS使用這些DLL(程序集)。以編程方式停止並啓動IIS。快速安全的方式

哪個是最好的方法(更多的性能,快速和安全的方式)或所有的方法來停止,啓動IIS 6.0的Windows 2003? (對於C#,.NET 3.5)

選項,我認爲:

  1. 檢測安裝在機器IIS。

  2. Process.Start()使用命令:iisreset /stopiisreset /start

  3. 使用ServiceController的類GET 「萬維網發佈服務」( 「W3SVC」) 和做罷

    controller.Stop(); 
    controller.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(timeoutSeconds)); 
    

    ,做啓動

    controller.Start(); 
    controller.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(timeoutSeconds)); 
    
  4. Process.Start()使用命令:taskkill/IM aspnet_wp.exe/F(在Win2003中使用w3wp.exe)

  5. 另一個選項,我不知道?

回答

5

你不需要做所有這些事情。

只需使用iisreset /stop然後iisreset /start即可完成部署。

它相當快速,並確保IIS的安全重啓。

編輯:

您可以使用WiX進行網站和虛擬目錄的完整配置。

維克斯樣品在IIS中創建一個網站(將不作爲就是工作):

<!-- Create the web site in IIS --> 
<Component Id="WebSiteComponent" Guid="<INSERT-GUID>" KeyPath="yes"> 
    <iis:WebAppPool Id="WebSiteAppPool" Name="WebSiteAppPool" RecycleMinutes="1740" QueueLimit="4000" IdleTimeout="20" MaxWorkerProcesses="1" Identity="networkService" /> 
    <!-- web site --> 
    <iis:WebSite Id="WebSiteIIS" AutoStart="yes" ConfigureIfExists="yes" Description="WebSite" SiteId="59" StartOnInstall="yes" Directory="SiteFolder"> 
    <!-- Host headers to enable web site to be hosted on port 80 --> 
    <iis:WebAddress Id="HostHeader" Header="myWebSite" IP="*" Port="80" Secure="no" /> 
    <iis:WebAddress Id="SecureHostHeader" Header="myWebSite" IP="*" Port="443" Secure="yes" /> 
    <!-- download web site web application --> 
    <iis:WebApplication Id="WebSiteWebApplication" AllowSessions="yes" SessionTimeout="20" Buffer="yes" ParentPaths="no" ClientDebugging="no" Name="Default Application" WebAppPool="WebSiteAppPool" DefaultScript="VBScript" ScriptTimeout="90" ServerDebugging="no" /> 
    <iis:WebDirProperties Id="WebSiteProperties" Read="yes" LogVisits="yes" Index="yes" Execute="no" Write="no" AnonymousAccess="yes" AccessSSL="no" Script="yes" AspDetailedError="yes" /> 
    <!-- web service virtual directory --> 
    <iis:WebVirtualDir Id="WebServiceVDir" Alias="Service" Directory="WebServiceFolder"> 
    <iis:WebDirProperties Id="WebServiceVDirProperties" Read="yes" Write="yes" LogVisits="yes" Index="yes" BasicAuthentication="yes" AnonymousAccess="no" AccessSSL="yes" AccessSSL128="yes" Execute="no" Script="yes" AspDetailedError="yes" /> 
    <iis:WebApplication Id="WebServiceWebApplication" AllowSessions="yes" Buffer="yes" ClientDebugging="no" ServerDebugging="no" WebAppPool="WebSiteAppPool" Name="Default Application" SessionTimeout="20" ParentPaths="no" DefaultScript="VBScript" ScriptTimeout="90" /> 
    </iis:WebVirtualDir> 
</iis:WebSite> 
</Component> 

另一個例子在這裏看到:

http://strangelights.com/blog/archive/2004/10/08/179.aspx

+0

如果你只是需要回收服務:'iisreset/restart'。並注意在Win2k8/Vista和更高版本,這需要從提升的命令/ PowerShell提示。 – Richard 2010-08-17 13:01:04

+0

就我個人而言,我會使用WiX安裝程序來部署這些文件,該安裝程序會將所有這些東西都整理出來,並允許在需要時快速部署到新服務器。 – fletcher 2010-08-17 13:03:36

+0

@Richard:任何示例命令/ PowerShell? @fletcher:WIX的任何樣本?我使用Msbuild腳本進行部署。 – Kiquenet 2010-08-18 06:20:37

2
# IISReset.ps1 - using PowerShell 
[array] $services = ('W3SVC','SMTPSVC','IISAdmin') 
foreach($service in $services) 
{ 
    $tst = Get-Service $service -ErrorAction SilentlyContinue 
    if($tst -ne $null) 
    { 
     Write-Host $service 
     Stop-Service -Name $service 
    } 
} 

[array]::Reverse($services) 
foreach($service in $services) 
{ 
    $tst = Get-Service $service -ErrorAction SilentlyContinue 
    if($tst -ne $null) 
    { 
     Write-Host $service 
     Start-Service -Name $service 
    } 
}