在HTTP://www.aliyun.com/zixun/aggregation/13357.html">Azure Web Role中,開發者經常會面臨一些場景,需要對IIS伺服器做一定的配置和優化,以實現Web Role中的一些功能,如關閉靜態檔加密(site compression)、強制SSL訪問等, 此類場景的出現具有一個共同的特點:web本身(包括code和web.config)不能實現開發者的需求,開發者必須通過配置web伺服器(IIS)來實現其期望的web特性。
在PaaS中,使用者通過遠端連線(RDP)在web role虛機上的修改只能暫時生效,web role虛機在經歷雲平臺的系統更新(每月一到兩次)後,虛機環境會被恢復到剛剛發佈的狀態, 即使用者通過遠端連線而做的設定(如IIS設定)會全部丟失!
因此,在Azure Web Role中,開發者如果需要自訂配置IIS伺服器,必須通過代碼來實現,以下就是一個例子:
1. 示例web role中,開啟了HTTP和HTTPs埠,網站中有一個資料夾test,測試目標是test目錄下的所有頁面僅能通過HTTPs訪問。 如示例專案:
2. 添加代碼到webrole.cs檔中實現IIS中的SSL設置。 此處需要指定目標目錄名。
public override bool OnStart()
{
By default, the website name is "[ Current Role Instance id]_Web"
string sitename = RoleEnvironment.CurrentRoleInstance.Id + "_Web";
The folder you want to expose it only via HTTPs
string foldername = "test";
string cmd = string. Format(" set config \"{0}/{1}/\" /section:access /sslFlags:Ssl /commit:APPHOST", sitename, foldername);
string appcmdpath = @"d:\Windows\System32\inetsrv\appcmd.exe";
try
{
Process.Start(new ProcessStartInfo(appcmdpath, cmd));
Trace.TraceInformation("Initialize IIS ssl succeed.");
System.IO.File.AppendAllText("log.txt", DateTime.Now.ToString() + " | Initialize IIS ssl succeed.");
}
catch (Exception ex)
{
Trace.TraceError(ex. Message);
System.IO.File.AppendAllText("log.txt", DateTime.Now.ToString() + " | " + ex. Message + " | " + cmd);
throw;
}
return base. OnStart();
}
3. 在servicedefinition檔中,找到對應的web role,添加以下設置。
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="WindowsAzure4" xmlns="HTTP://schemas.microsoft.com/ServiceHosting/2008/10/ ServiceDefinition" schemaVersion="2013-03.2.0">
<WebRole name="WebRole1" vmsize="Small">
<Runtime executionCoNtext="elevated"/>
<Sites>
<Site name="Web">
<Bindings>
......
4. 部署到雲端,生效。
HTTPs://***.cloudapp.net/test/test1.aspx (work)
HTTP://***.cloudapp.net/test/test1.aspx (does not work)
HTTPs://***.cloudapp.net/ (work)
HTTP://***.cloudapp.net/ (work)
在Azure Web Role中,其他的IIS設定也可以通過類似的方法實現。 其主要思路是:通過代碼調用IIS自帶的appcmd工具,用命令列的方式去設置IIS伺服器。
關於appcmd工具:HTTP://technet.microsoft.com/zh-cn/library/cc772200(v=ws.10).aspx
appcmd工具示例1--設定SSL訪問:HTTP://technet.microsoft.com/en-us/library/cc753983(v=ws.10).aspx
appcmd工具示例2--設定site compression:HTTP://support.microsoft.com/kb/930909
下面的代碼是使用上述類似的方式關閉site compression,IIS伺服器中,預設情況下site compression是開啟狀態。
1. Add code part to your webrole.cs
public override bool OnStart()
{
string cmd = string. Format(" set config /section:urlCompression /doStaticCompression:False");
string appcmdpath = @"d:\Windows\System32\inetsrv\appcmd.exe";
try
{
Process.Start(new ProcessStartInfo(appcmdpath, cmd));
Trace.TraceInformation("Success: turn off compression for static content in IIS.");
System.IO.File.AppendAllText("log.txt", DateTime.Now.ToString() + " | Success: turn off compression for static content in IIS.");
}
catch (Exception ex)
{
Trace.TraceError(ex. Message);
System.IO.File.AppendAllText("log.txt", DateTime.Now.ToString() + " | " + ex. Message + " | " + cmd);
throw;
}
return base. OnStart();
}
2. Do some change in service definition file:
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="WindowsAzure7" xmlns="HTTP://schemas.microsoft.com/ServiceHosting/2008/10/ ServiceDefinition" schemaVersion="2014-01.2.3">
<WebRole name="WebRole1" vmsize="Small">
<Runtime executionCoNtext="elevated" />
<Sites>
<Site name="Web">
......
小結:Azure Web Role中,如果需要設定IIS伺服器,需要通過代碼方式來調用appcmd,以實現特別需求的伺服器功能。 任何通過遠端連線的手動修改都是不可取的,其隨時可能失效。