ASP.NET網站與通常的桌面程序不一樣,不是拷貝過來就能運行的(數據庫鏈接除外)。 要想運行它,一般須要一些配置過程。
可是,咱們到底須要配置什麼呢?
答案是:查看web.confightml
web.config一般會放在網站的根目錄,這個文件中包含了一最重要的網站運行參數。好比: connectionStrings,httpHandlers,httpModules ,這些參數都是網站開發人員認爲運行網站所必需的參數。 所以,若是咱們想將一個網站部署到IIS中,必須首先打開web.config文件,逐個確認這些重要的參數是否符合要求。web
這裏要補充一點的是:有些開發人員喜歡將各種參數放在appSettings配置節中,即使是數據庫的鏈接字符串也放在appSettings中。 我只能說:這是個很很差的習慣。所以,在部署這類網站時,可能還要注意一下appSettings是否包含數據庫的鏈接字符串, 這就須要人工識別了。固然了,appSettings中還可能包含一些重要目錄配置,一樣,也只能人工識別了。正則表達式
今天要講述的參數主要涉及到IIS和SQL SERVER,所以本文將會分開介紹它們。
並且IIS還會分爲6和7.5二個版原本單獨演示。
SQL SERVER則以 2005 Express版原本演示。
我演示所用的操做系統爲:Windows Server 2003和Windows 7 ,它們分別附帶了IIS 6和IIS 7.5sql
說明:一般咱們在部署網站時,都應該先根據web.config定義的那些重要參數來配置網站。 但爲了讓您能對這些參數有較深入的印象,下面的演示中,不是先根據web.config來配置網站, 而是採用【從建立一個站點後,一步一步地發現問題並解決】的方式來說解這個過程。數據庫
每一個ASP.NET程序都是一個網站,要想運行它們,都須要在IIS中部署它們, 部署的第一步就是要在IIS建立一個網站。 在IIS中建立網站的過程比較簡單,由於IIS都提供嚮導界面來幫助咱們完成這個配置過程, 所以,本文打算省略那些無心義的貼圖。express
說明,咱們先從IIS6開始。 這裏只要求您在IIS中建立一個網站,把它配置成網站就能夠了,其它的配置咱們後面再談。
示例項目:點擊此處進入 MyMVC DEMO 下載頁面瀏覽器
網站建立好了嗎?我停下來等一下吧。安全
個人網站配置好了,如今已經能夠用瀏覽器訪問它。服務器
如今咱們能夠切換風格來試試效果,點擊頁面右上角的【3】試試看。mvc
噢,怎麼一開始就出錯了:
看到這個提示,不要茫然。爲了界面友好,我用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請求地址的擴展名,只是擔憂一些人認爲俗氣而已。
回到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】這二個擴展名。因爲這二個擴展名的註冊已經存在了, 因此,我須要修改它們的配置:雙擊配置項,確保不要勾選【確認文件是否存在】便可。
讓咱們再回到前面已配置好的示例中,此時頁面的顯示應該是這個樣子的:
點擊一下頁面上的連接【/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目錄有寫入權限。 設置以下圖:
好了,您能夠再去重啓網站所在的【應用程序池】,會發現如今數據能正常保存了。
在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的配置都介紹完了。
前面介紹瞭如何在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中建立一個網站,並指向程序目錄便可。
注意:若是程序須要訪問本地文件或者數據庫,那麼還須要設置文件系統或者數據庫的訪問權限,具體可參考前面相關小節。
在前面的演示中,爲了簡單,選擇了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配置的相關過程以下:(嚮導中沒有貼圖的步驟能夠直接肯定)
如今咱們就可使用域名的方式來瀏覽個人示例了: