如何在IIS6,7部署ASP.NET網站

在我的第一篇博客中,我發佈過一個示例項目,主要演示了我的我的AJAX框架我的通用數據訪問層。雖然在當初我認爲我已考慮地比較周全了,而且還提供了足夠的說明文檔,但在發佈後的將近一年的時間裏,還是有不少人給我發郵件,問我一些關於不能運行示例的問題。在所有問題中,主要集中在IIS和SQL SERVER的配置方面。因此,我認爲還是有必要再來談一下在IIS6/7以及SQL SERVER中部署ASP.NET網站的過程了。

在上篇博客【寫自己的ASP.NET MVC框架(下)】中,我又發佈了一個示例項目,它也包含一個網站項目,今天的介紹過程將主要以這個示例爲主。對於以前的示例所需配置的相同部分將不會重複介紹,不同點則會額外補充。

查看web.config文件

ASP.NET網站與一般的桌面程序不同,不是拷貝過來就能運行的(數據庫連接除外)。要想運行它,通常需要一些配置過程。
但是,我們到底需要配置什麼呢?
答案是:查看web.config

web.config通常會放在網站的根目錄,這個文件中包含了一最重要的網站運行參數。比如:connectionStrings,httpHandlers,httpModules ,這些參數都是網站開發人員認爲運行網站所必需的參數。因此,如果我們想將一個網站部署到IIS中,必須首先打開web.config文件,逐個確認這些重要的參數是否符合要求。

這裏要補充一點的是:有些開發人員喜歡將各類參數放在appSettings配置節中,即便是數據庫的連接字符串也放在appSettings中。我只能說:這是個很不好的習慣。因此,在部署這類網站時,可能還要注意一下appSettings是否包含數據庫的連接字符串,這就需要人工識別了。當然了,appSettings中還可能包含一些重要目錄配置,同樣,也只能人工識別了。

今天要講述的參數主要涉及到IIS和SQL SERVER,因此本文將會分開介紹它們。
而且IIS還會分爲6和7.5二個版本來單獨演示。
SQL SERVER則以 2005 Express版本來演示。
我演示所用的操作系統爲:Windows Server 2003和Windows 7 ,它們分別附帶了IIS 6和IIS 7.5

說明:通常我們在部署網站時,都應該先根據web.config定義的那些重要參數來配置網站。但爲了讓您能對這些參數有較深刻的印象,下面的演示中,不是先根據web.config來配置網站,而是採用【從創建一個站點後,一步一步地發現問題並解決】的方式來講解這個過程。

在IIS中創建網站

每個ASP.NET程序都是一個網站,要想運行它們,都需要在IIS中部署它們,部署的第一步就是要在IIS創建一個網站。在IIS中創建網站的過程比較簡單,因爲IIS都提供嚮導界面來幫助我們完成這個配置過程,因此,本文打算省略那些無意義的貼圖。

說明,我們先從IIS6開始。這裏只要求您在IIS中創建一個網站,把它配置成網站就可以了,其它的配置我們後面再談。
示例項目:點擊此處進入 MyMVC DEMO 下載頁面

網站創建好了嗎?我停下來等一下吧。

我的網站配置好了,現在已經可以用瀏覽器訪問它。

現在我們可以切換風格來試試效果,點擊頁面右上角的【3】試試看。

噢,怎麼一開始就出錯了:

看到這個提示,不要茫然。爲了界面友好,我用JavaScript捕獲了這個錯誤,但現在我們需要知道錯誤的原因是什麼,怎麼辦呢?

有FireBug或者Fiddler2嗎?
如果有,就打開它們吧。下圖是我用FireBug看到的錯誤原因(需要重新執行剛纔的操作):

從FireBug中,我們可以看到,剛纔的操作觸發了一次請求,請求的地址是:/AjaxStyle/SetStyle.cspx
cspx是個什麼擴展名呢?還是打開web.config看一下吧。

<httpHandlers>
    <add path="*.cspx" verb="*" type="MyMVC.AjaxHandlerFactory, MyMVC" validate="true" />
    <add path="*.aspx" verb="*" type="MyMVC.MvcPageHandlerFactory, MyMVC" validate="true" />
    <add path="/mvc/*" verb="*" type="MyMVC.MvcPageHandlerFactory, MyMVC" validate="true" />
</httpHandlers>

在web.config中,網站要求配置的一些httpHandlers中,第一個便是針對【cspx】擴展名的。

這裏我要解釋一下【cspx】這個擴展名了。在以前的示例中,我選擇了【cs】這個擴展名錶示一個AJAX調用,但是,後來發現很多人在IIS中部署中遇到問題了(原因後面再說)。於是,這次我換了個擴展名。然而,又有人問我:cspx, 是不是寫錯了? 或許他認爲應該是【aspx】纔對。

這個問題我用郵件回答過多次了,今天用博客的形式再回答一次:
取什麼擴展名都不重要,我只要選擇沒有用過的擴展名來區分是AJAX調用就可以了。我也可以取【fish】來做爲AJAX請求地址的擴展名,只是擔心一些人認爲俗氣而已。

IIS6 添加擴展名映射

回到IIS,在網站節點上,右擊,從彈出的菜單中,選擇【屬性】,然後在彈出的對話框中,選擇【主目錄】選項卡,並點擊【配置】按鈕。此時的界面應該是這樣的:

找到【ascx】這個擴展名,雙擊它,是不是彈出下面這個對話框?

照着圖片的操作去完成:複製【可執行文件】的設置路徑。然後點擊【取消】關閉對話框。

此時將回到【應用程序配置】對話框,點擊【添加...】按鈕,

照着圖片操作吧。對話框中的【可執行文件】的參數,此時已在Windows剪切板中,現在只要粘貼就可以了。

全部【確定】,關閉所有對話框,再回到瀏覽器,然後再試一次。

現在可以操作了吧?

先不要點擊其它鏈接,還是來對剛纔的操作做個小結吧。

在ASP.NET中,有時候我們可能會需要創建自己所需的HttpHandler來處理一些特殊的請求。
我的MyMVC框架就有這個需求:將AJAX請求與頁面的請求分開來處理。
所以我們需要一些特殊格式的URL。通常選擇一個沒用過的擴展名會比較方便,因此我選擇了 cspx
爲了能告訴ASP.NET將以下格式的ULR映射到AjaxHandlerFactory

/Fish.AA.AjaxTest/Add.cspx
/Fish.BB.AjaxTest.Add.cspx
/Fish/BB/AjaxTest/Add.cspx
/AjaxDemo/GetMd5.cspx
/AjaxDemo.GetMd5.cspx

我就需要在web.config中註冊這種URL模式,並且爲了能最好的匹配這些URL,我可以使用下面的配置:

<httpHandlers>
    <add path="*Ajax*/*.cspx,*Ajax*.*.cspx" verb="*" 
                                type="MyMVC.AjaxHandlerFactory, MyMVC" validate="true"/>
</httpHandlers>

我們可以用Visual Studio自帶的WebDev.WebServer.EXE來運行網站程序。
本來,這一切都是很完美的。
可是,IIS中並不支持這麼複雜的path設置,它只能支持簡單的擴展名映射。
所以,我也只好使用簡單的擴展名:【.cspx】來向IIS註冊。

我再來解釋一下,爲什麼在ASP.NET中,前面那個path能夠識別我上面所說的5種格式的URL?
在ASP.NET管線的處理器映射階段,ASP.NET會將【*Ajax*/*.cspx,*Ajax*.*.cspx】轉換成下面的正則表達式,再來檢查每個請求的URL是否匹配。

(?:\A|(?<=/))[^/]*Ajax[^/]*/[^/]*\.cspx\z|(?:\A|(?<=/))[^/]*Ajax[^/]*\.[^/]*\.cspx\z

有興趣的話,您也可以檢驗一下,這個正則表達式與前面的URL都能匹配。
從這裏也可以看出ASP.NET對處理器的映射實現,是可以支持比較複雜的URL模式的。
關於處理器的映射過程可以參考我的博客【細說 HttpHandler 的映射過程】

前面解釋了我爲什麼最終選擇【.cspx】來向IIS註冊處理器了。
在註冊時,還有二個參數也比較重要:
1. 可執行文件:其實就是一個實現了ISAPI的模塊,IIS會將匹配的請求交給它,然後由它再交給ASP.NET。這個參數的路徑比較長,我們根本不需要記住它,只需要找個已有配置中,將它COPY出來就可以了。
2. 確認文件是否存在:這個參數一定不要選擇。因爲我們請求的URL並沒有對應的文件存在。

這裏要補充一點:
我以前發佈的FishWebLib DEMO中,使用了【cc】這樣的擴展名,可以按照上面的方法註冊。
但我還使用了【cs】和【ascx】這二個擴展名。由於這二個擴展名的註冊已經存在了,所以,我需要修改它們的配置:雙擊配置項,確保不要勾選【確認文件是否存在】即可。

IIS6 無擴展名的映射

讓我們再回到前面已配置好的示例中,此時頁面的顯示應該是這個樣子的:

點擊一下頁面上的鏈接【/mvc/Customers】試試。

不要以爲我是在故意設置陷阱哦。我在設計示例程序時,根本也沒想到會這樣。

到這裏,可能有人會想,在httpHandlers中不是還有個【path="/mvc/*"】沒有配置嗎?
繼續按照前面的方法去配置就能解決問題了。

好吧,我再照着前面的方法再試着註冊【path="/mvc/*"】試試,結果如下:

因此,前面的方法對於這類【無擴展名】的URL來說,是無效的。

對於這類無擴展名的URL,在IIS6中可以使用添加【通配符應用程序映射】的方法來解決。
回到【應用程序配置】對話框,點擊【插入...】按鈕,彈出下面的對話框:

按照圖片來設置一下吧。然後,【確定】關閉對話框。此時的設置應該是這樣的:

全部點擊【確定】關閉所有對話框。

讓我們再次回到示例程序,此時可以發現,什麼問題都沒有了。

再補充一句:如果使用這種方法,前面註冊cspx的過程就不需要了。因爲此時所有的請求都會交給ASP.NET,而ASP.NET會識別我在web.config中所做的配置。

目錄的寫入權限

爲了方便MyMVC DEMO的部署過程,這次我選擇了XML文件做爲數據源。寫入XML的時機是在ASP.NET被停止運行的時候(Application_End事件中)。

讓一個在IIS中運行的網站停止運行的方法就是停止網站所使用的【應用程序池】。
可以在網站屬性對話框中找到網站所使用的【應用程序池】:

再切到IIS的【應用程序池】的列表,找到前面那個【應用程序池】,右擊鼠標,
從彈出的菜單中點擊【屬性】菜單,然後在出現的對話框中選擇【標識】選項卡:

從這個圖片中,我們可以知道網站以哪個Windows帳號在運行。記住這裏,後面會用到。

好吧,點擊【取消】關閉對話框。

補充一點:要想知道網站以什麼帳號運行,還可以查看【Windows任務管理器】,找到w3wp.exe所在進程即可:

回到示例程序中,我們可以隨便添加一些數據。
然後,在【應用程序池】列表中,停止網站所使用的應用程序池。再啓動它。
重新刷新示例程序的頁面。

發現什麼了?是不是數據沒有保存下來?

如果發現數據沒有保存起來,可以繼續閱讀。

數據不能保存的原因並不是因爲代碼沒有執行,而是因爲,網站運行的帳號沒有權限寫數據文件。
XML是放在網站的App_Data目錄中,爲了檢查網站是否有寫入權限,可以在App_Data目錄上右擊,然後選擇【屬性】菜單,切換到【安全】選項卡:

經過前面的分析,我們已經知道網站是以【NETWORK SERVICE】帳號運行,然而,在這個目錄的安全設置中,並沒有允許【NETWORK SERVICE】帳號能有寫入權限,所以,網站在停止運行時,是由於沒有權限才導致不能保存數據的。

此時,我們可以賦予【NETWORK SERVICE】帳號對App_Data目錄有寫入權限。設置如下圖:

好了,您可以再去重啓網站所在的【應用程序池】,會發現現在數據能正常保存了。

SQL SERVER的配置

FishWebLib DEMO中,我爲了演示我的通用數據訪問層而引入了SQL SERVER,因此,示例程序需要SQL SERVER的支持。

首先,還是回到web.config,來看一下示例程序需要訪問什麼樣的數據庫:

注意:示例程序需要連接的SQL SERVER服務器是:localhost\sqlexpress

我的機器上安裝了三個SQL SERVER的實例:

因此,我需要以【命名實例】的方式來訪問。
如果您的機器將SQL SERVER做爲【默認實例】來安裝,則需要修改爲:localhost

在示例的壓縮包中,我提供了SQL SERVER所需的數據文件:db\MyNorthwind.mdf
在運行示例前,我需要將它【附加】到SQL SERVER中。

現在需要先啓動 SQL Server Management Studio ,連接SQL SERVER的實例後,
在【對象資源管理器】的樹型控件中,找到【數據庫】節點,右擊,然後點擊【附加...】菜單,
在出現的對話框中,點擊【添加...】按鈕,選擇MyNorthwind.mdf文件,然後點擊【確定】按鈕。

我這邊出錯了。

再仔細地看一下,發現是日誌文件沒有找到造成的。
是的,我並沒將日誌文件也放在壓縮包中。
好吧,在對話框中刪除日誌文件就可以了,再次【確定】。

還是出錯:

注意了:這次的錯誤與前面的錯誤並不一樣。這次是說沒有目錄的寫入權限。

當遇到沒有目錄的訪問權限時,我們首先要知道程序是以什麼帳號在運行。
這是非常重要的。要不然,如何配置目錄的訪問權限呢?

判斷程序以什麼帳號運行最簡單方法就是:打開【Windows任務管理器】,然後去找進程。
這個方法可參考前面的過程。最終我們可以發現sqlserver.exe是以【NETWORK SERVICE】帳號在運行(我的機器是這樣)。
好吧,再按照前面設置App_Data目錄權限的方法再設置MyNorthwind.mdf文件所在目錄的訪問權限。

再次嘗試【附加】數據庫,將能成功完成。
在我機器上,現在已經可以運行示例程序了。

說明:如果由於種種原因,不使用【Integrated Security=SSPI】的連接認證方式,還可以使用【用戶名/密碼】的方式,那就需要修改web.config中的連接字符串了。

小結:
1. 由於SQL SERVER的數據文件保存在Windows操作系統中,因此必須授予運行SQL SERVER進程的帳號所必需的目錄訪問權限。
2. 連接到SQL SERVER時,也可能會因爲SQL SERVER驗證連接身份而失敗,那麼也必須配置需要的訪問權限。

到此爲止,示例所需的IIS配置以及SQL SERVER的配置都介紹完了。

在IIS7中部署ASP.NET程序

前面介紹瞭如何在IIS6中部署一個ASP.NET網站,現來看一下在IIS7.5中如何完成這個過程。
接下來的演示將以Windows 7的IIS7.5爲準。

IIS7.5相對於IIS6的改進,給我的感覺是:部署ASP.NET網站簡直太容易了。

IIS7爲了兼容老版本,它支持二種模式來運行ASP.NET程序:集成模式,經典模式。
所謂的經典模式,其實就是爲了兼容IIS6的模式。下文將着重介紹集成模式,這樣才能體現IIS改進的優勢。

在IIS6中,我們需要配置擴展名的映射或者通配符映射,將請求交給一個ISAPI篩選器,然後由它再交給ASP.NET,最終由ASP.NET再將請求交給我們的httpHandlers, httpModules。我們在web.config中配置的httpHandlers, httpModules,對於IIS6來說是不可見的,所以,只能再次到IIS中配置。

從IIS7開始,IIS支持以一種稱爲【集成模式】的方式運行ASP.NET程序,此時,IIS能直接將請求交給ASP.NET的httpHandlers和httpModules,而且還可以直接從web.config中直接讀取配置,因此,只要我們把web.config準備好,配置任務就非常簡單了。

由於這個緣故,我在後來提供的示例中,在web.config中已增加對IIS7的支持。
以下就是二個示例項目所需的IIS7的配置部分。

FishWebLib DEMO只需要下面的配置就可以了:

MyMVC DEMO所需的配置如下:

以上這些配置會反映在IIS7.5的哪些地方看到呢?
請看下圖:

在這個【處理器映射】列表中,前三個不正是我在web.config中的配置嘛。

前面還有一塊fileExtensions的配置又是做什麼的呢?
請看下圖:

對於FishWebLib DEMO來說,它使用了 cs, ascx 這樣的擴展名,而且這二個擴展名按照默認的配置是禁止訪問的,所以在那個示例中,這段配置的用途是將這二個擴展名變成允許訪問。

我在使用Windows7的IIS7.5時,還發現一個與IIS6不同的地方,它會默認爲每個網站創建一個獨立的應用程序池,而且運行帳號也不是NETWORK SERVICE,不過,我們可以容易地在【應用程序池】的屬性中去修改它。

小結:
在IIS7.5中部署ASP.NET網站是件容易的事,前提是:事先準備好web.config中的system.webServer配置節。
然後只需要創建在IIS中創建一個網站,並指向程序目錄即可。
注意:如果程序需要訪問本地文件或者數據庫,那麼還需要設置文件系統或者數據庫的訪問權限,具體可參考前面相關小節。

80端口和域名

在前面的演示中,爲了簡單,選擇了25678這個端口,那是因爲80端口已被使用。這樣做實際上不影響網站的運行,不過,URL看起來就不美觀了。通常HTTP默認是使用80端口,如果使用這個端口,那麼URL中就不會出現端口號了。爲了讓URL地址看起來更美觀,按下來我將演示如何使用80端口。

在IIS中,爲了能讓一個網站程序運行在80號端口中,有2個辦法:
1. 爲網站程序使用其它的IP地址的80端口。
2. 爲網站指定域名綁定。

我們可以在網卡的配置中新增一個IP地址(如果已經有多個IP就不用這樣做了):

然後在IIS中,爲網站設置【綁定】,使用這個IP地址了。請參考下圖:

除了使用新IP地址的方式外,我們還可以使用域名的方式讓網站可以在80端口下面運行。
方法還是在IIS中設置網站的【綁定】操作,給網站指定一個域名即可:

最終的設置應該是下面這個樣子的:

此時我們就可以使用下面二種方式來訪問我的示例網站了:
http://192.168.0.222
http://www.mymvc-demo.com

不過這裏又有個新問題:域名從哪裏來?

答案有二個(對於演示來說):
1. 修改 C:\Windows\System32\drivers\etc\hosts 文件,
  增加一個映射條目:127.0.0.1 www.mymvc-demo.com 即可。
2. 如果您使用的是Windows Server的操作系統,也可以自己給自己分配域名,請繼續閱讀。

在Windows Server的操作系統中,我們可以使用DNS服務創建自己的域名,大致的過程是:
1. 創建一個反向查找區域。
2. 創建一個正向查找區域。
3. 在正向查找區域新建一個WWW的主機。
4. 在IIS中爲網站設置綁定,指向新的域名。
5. 設置網卡的DNS服務器地址,指向有DNS服務的機器。
這種方式或許對於單臺機器來說,比直接修改host文件要麻煩,但如果是在局域網內部使用將會非常方便。

DNS配置的相關過程如下:(嚮導中沒有貼圖的步驟可以直接確定)

現在我們就可以使用域名的方式來瀏覽我的示例了:


參考:http://www.cnblogs.com/fish-li/archive/2012/02/26/2368989.html#_labelStart



發佈了8 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章