在Azure Web Role中自訂配置IIS伺服器

來源:互聯網
上載者:User
關鍵字 Azure Azure IIS伺服器 自訂配置

在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,以實現特別需求的伺服器功能。 任何通過遠端連線的手動修改都是不可取的,其隨時可能失效。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.