﻿# ASP.NET 開發人員應使用 IIS Express 進行開發與測試

[IIS 7.5 Express](https://learn.microsoft.com/en-us/iis/extensions/introduction-to-iis-express/iis-express-overview) 是一套針對 ASP.NET 開發人員特別設計的 IIS 7.5 版本，我發現有許多人並不知道他的存在，甚至於不知道何時要使用他，就覺得這只是另一個提供 ASP.NET 執行環境的程式而已，在 Visual Studio 2010/2008/2005 內建的 ASP.NET 開發伺服器 (Cassini) 已經使用很久，用來作為開發測試之用也沒什麼問題，有必要將開發環境的伺服器修改成使用 [IIS 7.5 Express](https://learn.microsoft.com/en-us/iis/extensions/introduction-to-iis-express/iis-express-overview) 來執行嗎？今天我就提出幾個重要的觀點。

首先，IIS 6 與 IIS 7 在其架構上做出了許多變更，尤其是在要求管線 (request pipeline) 的不同之處，以下列出兩張要求管線的圖示：

**IIS 6.0 的要求管線**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c57a8cb5f2b9b1d6981b-image_968.png)

**IIS 7.0 的要求管線**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d2186fadcd08de2c2a2c-image_969.png)

上圖參考至：IIS 6 and IIS 7 - How different are they? 此文章對此架構有詳細說明，另外也建議參考以下文章以進行全盤理解：

-   [IIS 7.0 的 ASP.NET 應用程式生命週期概觀](http://msdn.microsoft.com/zh-tw/library/bb470252.aspx)
-   [IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀](http://msdn.microsoft.com/zh-tw/library/ms178473.aspx)
-   [Overview of IIS 6.0 Architecture](http://technet.microsoft.com/en-us/library/cc783014.aspx)
-   [Introduction to IIS 7 Architecture](https://learn.microsoft.com/en-us/iis/get-started/introduction-to-iis/introduction-to-iis-architecture)

如果不講那麼多技術原理，對一般開發人員來說，最明顯的差異就是 ASP.NET 網站根目錄下的 Web.config 檔案，在該檔案中有兩個宣告 HttpModules 與 HttpHandlers 的地方，分別圖示如下：

下圖的 <httpHandlers> 與 <httpModules> 位於 <system.web> 區段下，主要在 IIS 5 / IIS 6 架構下使用

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0ab40c8b1c986bf6cf14-image_970.png "image")

而下圖的 <modules> 與 <handlers> 位於 <system.webServer> 區段下，主要是給 IIS 7 / IIS 7.5 架構下會用到，這兩個定義幾乎一樣（當然有些屬性不太一樣），但是卻需要定義兩遍！

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ac412d0ec26b4b5a81eb-image_971.png "image")

如果你的網站專案使用 Visual Studio 內建的 ASP.NET 開發伺服器 來執行與測試，那麼你在 <system.webServer> 區段下的所有定義與設定將完全無法測試到，因為 ASP.NET 開發伺服器 完全是以 IIS 6.0 的架構下去執行的，要是你的網站未來的部署環境是 IIS 7.0 / IIS 7.5 的話，那麼這樣的開發環境就不是十分理想。

像我們公司在 IIS Express 尚未推出之前，每一位開發人員都要在 Windows Vista / Windows 7 的本機加裝 IIS 7 並且要為每一個開發中的網站專案特別建立一個站台，人多的時候每個人都要特別教一下才可以將環境完整設定好，可以說是挺不方便的。

但是 IIS Express 又沒有管理界面，使用上其實也不方便，不熟悉 IIS 架構的開發人員使用起來也是會很辛苦的，還好 [Visual Studio 2010 SP1](http://web.archive.org/web/20120106033923/http://www.microsoft.com/downloads/zh-tw/details.aspx?FamilyID=75568aa6-8107-475d-948a-ef22627e57a5&displayLang=zh-tw) 已經正式將 IIS Express 整合進 Visual Studio 2010，也代表著你在 Visual Studio 2010 裡面的網站專案都可以方便的指定使用 IIS Express 來執行網站，操作上已經簡單的無法再簡單。

如下圖就是設定某專案使用 IIS Express 來當成開發伺服器：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/382fb726442b5faf79d3-image_972.png)

第一次使用的時候，由於本機並沒有設定過 IIS Express 的站台，所以會問你要不要裝載上去，回答「是」就對了。如果你的開發團隊有使用到版本控管，當其他成員更新檔案後第一次開啟專案也會出現這個視窗，只要按下「是」就會自動安裝完成，不過前提是大家都要先升級 Visual Studio 2010 版本到 SP1 以及都要額外安裝 IIS 7.5 Express 才行。（備註：這兩個都可以透過 [Web PI](http://www.microsoft.com/web/downloads/platform.aspx) 來安裝）

 ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7b50acc2783c9b43d44b-SNAGHTML1ab64094.png)

裝好之後還會提示你安裝好的網址與埠號：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/edd46b7c9886797f9dc0-SNAGHTML1abac1e4.png)

不僅僅是 Web 應用程式專案可以用，連 Web 網站專案也都可以改用 IIS Express 當成開發伺服器之用，省去所有 IIS 站台安裝、設定的所有繁複流程。

如果你想將測試的網站部署在虛擬目錄下，也可以在網站專案的專案屬性中修改「專案 URL」的路徑，最後按下「建立虛擬目錄」即可，算是整合的非常好用了。

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/97d56c1c0977894822bc-image_thumb_67.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/3d538934ddc2987c1247-image_973.png)

你可能會問這個 IIS Express 到底跟完整版的 IIS 7.x 有什麼差異呢？我的回答是：幾乎一模一樣，僅差別在 IIS Express 是一個沒有管理界面的 IIS 7 而已！所有在 IIS 7 中能做到的地方，在 IIS Express 一樣都做的到，差別僅在於你要自行設定這些設定而已 (備註：大部分站台設定修改 **Web.config** 即可，其他設定可以參考 **我的文件\\IISExpress\\config\\applicationhost.config** 這個設定檔)。

正式環境用 IIS 7 的網站，可以慢慢改成用 IIS Express 來執行了，以我個人的轉移經驗來說，幾乎沒遇到什麼問題，與 IIS 7 相容性非常之高。

**相關連結**

-   [IIS Express Overview : IIS Express : Microsoft Web Platform : The Official Microsoft IIS Site](https://learn.microsoft.com/en-us/iis/extensions/introduction-to-iis-express/iis-express-overview)
-   [Microsoft 下載中心 - Internet Information Services (IIS) 7.5 Express](https://learn.microsoft.com/en-us/iis/extensions/introduction-to-iis-express/iis-express-overview)
-   [Introducing IIS Express - ScottGu's Blog](https://weblogs.asp.net/scottgu/introducing-iis-express)
-   [介紹 IIS Express](http://charlesbc.blogspot.com/2011/01/iis-express.html)
-   [使用 IIS Express](http://charlesbc.blogspot.com/2011/01/iis-express_16.html)
-   [ASP.NET Application Life Cycle Overview for IIS 7.0](http://msdn.microsoft.com/en-us/library/bb470252.aspx)
-   [IIS 7.0 的 ASP.NET 應用程式生命週期概觀](http://msdn.microsoft.com/zh-tw/library/bb470252.aspx)
-   [IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀](http://msdn.microsoft.com/zh-tw/library/ms178473.aspx)
-   [Overview of IIS 6.0 Architecture](http://technet.microsoft.com/en-us/library/cc783014.aspx)
-   [Introduction to IIS 7 Architecture](https://learn.microsoft.com/en-us/iis/get-started/introduction-to-iis/introduction-to-iis-architecture)
-   [Changes Between IIS 6.0 and IIS 7 Security](https://learn.microsoft.com/en-us/iis/get-started/whats-new-in-iis-7/changes-in-security-between-iis-60-and-iis-7-and-above)
-   Website Property page mapping between IIS 6 and IIS 7
-   IIS 6 and IIS 7 - How different are they?
-   [Why IIS7? Top 12 cool features…](https://web.archive.org/web/20150120100447/http://blogs.iis.net/bills/archive/2008/11/20/why-iis7-top-12-cool-features.aspx)
-   [IIS7 - Writing your first custom UI module with all winform controls](https://blogs.iis.net/rakkimk/iis7-writing-your-first-custom-ui-module-with-all-winform-controls/)
-   [Security Guidance for IIS](http://technet.microsoft.com/en-us/library/dd450371.aspx)
