為了幫助使用《ASP.NET技術(shù)詳解與應用實例》的讀者平穩(wěn)過渡到ASP.NET2.0,天天推出ASP.NET2.0系列,本系列教程編排基本上和該書內(nèi)容一致,供使用《ASP.NET技術(shù)詳解與應用實例》的讀者參考
--------------------------------------------------
在http://mqingqing123.cnblogs.com/archive/2006/01/18/319375.html 天天介紹了ASP.NET的基本編譯方式,當然上面只是理論性的東西,有點空洞,下面介紹在VS.NET2005如何具體部署ASP.NET應用程序
--本文僅供參考
在上面介紹了ASP.NET部署的基本原理,在進一步介紹之前,請理解安裝(Setup)和部署(Deployment)之間的區(qū)別。安裝是指將應用程序包裝成易于部署的形式,安裝好之后的應用程序可以之間在目標服務器上使用。部署是一個獲得應用程序并將它安裝到另一臺機器上的過程,在部署中您可能還需要做一些額外的配置。
下面介紹在實際中如何用VS.NET2005完成應用程序的部署,關(guān)于安裝就留給以后說了。
1、用VS.NET2005的“復制項目”功能部署--源代碼方式
在VS.NET2005里,可以直接把源代碼拷貝到目標服務器中,在解決方案資源管理器中,可以看到有一個“Copy Web Site”工具按鈕參考下圖,
單擊改按鈕后就可以在VS.NET中打開Copy Web Site窗口,如下圖。
整個內(nèi)部窗體大致分為兩個部分:Source Web site:現(xiàn)在本地Web應用程序資源,Remote Web site顯示的是遠程Web應用程序資源(也就是你要上傳的目標文件的位置)
但是你可能已經(jīng)看到,此時Remote Web site是灰色并不能夠使用,因此你還需要連接到遠程服務器。
在Copy Web Site工具欄目上,有一個Connect按鈕,單擊后出現(xiàn)連接選項,如圖,這正是前面介紹的打開Web的方式,稍微有點區(qū)別是此處你是部署應用程序?,F(xiàn)在你可以使用你的網(wǎng)絡服務商給你的帳戶進行遠程登陸,圖中所示登陸的是局域網(wǎng)內(nèi)的web服務器,將要上傳的位置在www文件夾下。
一旦登陸成功就可以部署應用程序,如圖,當你選中文件后,就可以同步本地和遠程服務器的文件,需要注意的是這里是“同步”而并不是簡單的拷貝。這種好處是當你在本地或者遠程更高后,可以同步以后,兩邊的文件可以同步更新。
2、利用Public Web Site部署應用程序――源代碼+二進制
可以利用VS.NET2005提供的Public Web Site部署經(jīng)過預先編譯的應用程序。這和ASP.NET1.1類似。要啟動public web site,從VS.NET2005的Build菜單里選擇“Public Web Site”如圖,這將彈出Public Web Site 對話框,參考下圖
在該圖里,需要輸入遠程服務器的地址,可以是HTTP,F(xiàn)TP等,這里我們以本機作為測試,輸入http://localhost,這將在當前IIS的主目錄里建立MyFirstPage項目。在下面的復選框里,說明如下:
Allow this precompiled site to be updatable:該選項允許*.aspx也沒并不編譯到匯報集里,也就是選中該選項后,你可以改變頁面的標記。
Use fixed naming and single page assemblies:該選項運行你預編譯特定的文件名稱的代碼。
Enable strong naming on precompiled assemblies:該選項要求生成重新命名的程序集。這里使用默認值。然后單擊“OK”,經(jīng)過編譯后,你就可以在IIS的主目錄里找到這些預編譯的文件。
此時如果你打開MyPage.aspx,代碼如下:
<%@ page language="C#" autoeventwireup="true" inherits="MyPage, App_Web_jmvb-kmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www./1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
Enter your name: <asp:TextBox ID="nameTextBox" runat="server" /><br />
<asp:Button ID="enterButton" runat="server"
Text="Enter" OnClick="enterButton_Click" /> <br />
<asp:Label ID="messageLabel" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
</html>
正如前面所說的,由于Page指令是<%@ page language="C#" autoeventwireup="true" inherits="MyPage, App_Web_jmvb-kmt" %>并不包含CodeFile,所以這種編譯方式和ASP.NET1.1兼容。
Page指令的inherits指出了MyPage.aspx的類集為MyPage和匯編集App_Web_jmvb-kmt。換句話說,當系統(tǒng)加載Page也沒時,將會到bin文件夾下的App_Web_jmvb-kmt.dll加載MyPage類作為MyPage.aspx后臺文件的頁面類。
3、利用Aspnet_compiler.exe部署應用程序
Aspnet_compiler.exe是ASP.NET2.0新增加的一個命令,所以對以前版本的.NET框架不可用,你可以在安裝目錄下找到該文件,例如c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727目錄學。
Aspnet_compiler.exe提供了很多參數(shù),你可以在命令行輸入 Aspnet_compiler.exe /?查看這些參數(shù)的意義。這里我們這種介紹查用的幾個參數(shù):
1、- m m參數(shù)告訴系統(tǒng)使用IIS的元數(shù)據(jù)配置應用程序,例如下面的命令
aspnet_compiler -m /LM/W3SVC/1/Root/MyApp c:\MyTarget
/LM/W3SVC/1/Root表示的是/LM/W3SVC/下是我們要用到的HTTP服務的配置信息,在“控制面板”里有一個"Server Extensions管理器"。你可以打開開你本機的配置。在這個命令里,它表示當前的應用程序是MyApp,該應用程序?qū)τ玫奈募锢砺窂绞莄:\MyTarget
2 -v v表示應用程序的虛擬路徑。如果同時和-p參數(shù)結(jié)合使用,則由 -p參數(shù)指出物理路徑,否則則使用IIS的元素數(shù)據(jù)配置,默認是應用程序的當前站點。
下面的命令和上面的登記。
aspnet_compiler -v /MyApp
而下面則不依靠IIS的配置,因為他顯示聲明應用程序的物理路徑
aspnet_compiler -v /MyApp -p c:\myapp c:\MyTarget
-u
v virtualPath –應用程序的虛擬路徑
-p physicalPath – 應用程序的事件位置
targetDirectory – 目標位置
另外還有一個參數(shù):u,這個參數(shù)告訴編譯器保留*.aspx頁面,以便將來更新,這中情況就是上面介紹的的“匯編集+二進制”代碼的形式
下面我們將介紹如何使用該命令,并進一步介紹ASP.NET1.1到ASP.NET2.0在部署的變更。
下面的代碼說明如何利用aspnet_compilier部署ASP.NET應用程序,該部署針對的是如下一種情況:
我利用VS.NET2005內(nèi)置的服務器并使用File System方式在我的文檔 C:\Documents and Settings\liwanbao\My Documents\Visual Studio 2005\WebSites下建立了MyFirstPage項目。
現(xiàn)在我要把該程序部署到本地IIS的服務器商,在IIS服務器中,我的應用程序名稱是DeplayApp,該應用程序指向的實際路徑是D:\DeplayMyFirstPage,所以,如果你打開IIS,看到的應該類似如下效果
這里其實就使用了上面介紹aspnet_compiler.exe常用的三個參數(shù)
DeplayApp是應用程序虛擬路徑,也就是上面-v參數(shù)制定的路徑
D:\DeplayMyFirstPage是虛擬路徑對應的實際物理路徑,也就是將要我要部署到位置的目標路徑
C:\Documents and Settings\liwanbao\My Documents\Visual Studio 2005\WebSites路徑是我開發(fā)項目源代碼的位置。
在上圖的命令里,首先設(shè)置了 Path路徑指向aspnet_compiler.exe以防止系統(tǒng)找不到該命令,具體指向的命令是
aspnet_compiler –v /DeplyApp -p MyFirstPage d:\DeplayMyFirstPage
這將在D:\DeplayMyFirstPage目錄學生成所需的文件(*.aspx),在App_Data目錄學可以找到應用程序的數(shù)據(jù)庫文件,需要注意的是在數(shù)據(jù)庫引用時,應用的是App_Data文件的當前位置,例如數(shù)據(jù)庫連接為:
<add name="DotNetEntry_DataConnectionString1" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DotNetEntry_Data.MDF;… />
此時部署時,系統(tǒng)自動將項目App_Data下的數(shù)據(jù)庫部署到目的的,而如果將上面代碼改為:
<add name="DotNetEntry_DataConnectionString1" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\DotNetEntry_Data.MDF;… />
由于制定了DotNetEntry_Data.MDF的絕對位置,所以目的文件并不保護App_Data文件
bin文件夾存放的是經(jīng)過編譯后的DLL文件,同時還包含對程序集的引用,例如用記事本打開default.aspx.cdcab7d2.compiled,類似代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<preserve resultType="3" virtualPath="/DeplayApp/Default.aspx" hash="fffffff5007efec4" filehash="6c5c681005a7e96b" flags="110000" assembly="App_Web_r8n0o27x" type="ASP.default_aspx">
<filedeps>
<filedep name="/DeplayApp/Default.aspx" />
<filedep name="/DeplayApp/Default.aspx.cs" />
</filedeps>
</preserve>
如果打開*.aspx頁面可以看到頁面的內(nèi)容都是
This is a marker file generated by the precompilation tool, and should not be deleted!
可能你會問既然全部是DLL文件為什么還要*.aspx文件呢?這些文件也沒有具體內(nèi)容,會不會是多余的?
要理解這個問題就需要轉(zhuǎn)到IIS了,換句話說這就不再是ASP.NET2.0的工作范疇了。對于客戶端請求,IIS首先會根據(jù)映射檢查您所請求的文件存在不存在,如果不存在就直接提示您所請求的文件沒有找到。 可以看到此時ASP.NET2.0框架還沒有接管呢,解決這個文件最簡單的方法就是不用檢測文件是否存在,參考下圖