下面我們運行一下本文下載包中的一個.NET執行文件。 ?、?從本文最后下載文件,將文件解壓縮到C:/CodeDownloadDemo文件夾。 ⑵ 在IIS中創建一個虛擬文件夾CodeDownloadDemo。 ⑶ 將虛擬文件夾映射到C:/CodeDownloadDemo/Loader/Bin文件夾。 ?、?啟動IE瀏覽器,輸入下面的URL:http://localhost/CodeDownloadDemo/loader.exe。 看到loader應用程序在瀏覽器外面運行了嗎?應用程序一旦開始運行,即使關閉了瀏覽器,我們仍可以訪問應用程序。對于任何其他.NET應用程序,我們都可以照此辦理,只要將它放到Web服務器上,然后用瀏覽器啟動即可。 二、UrlScan工具的影響 只要Web服務器上沒有安裝UrlScan工具,上面的例子就可以毫無問題地運行。UrlScan工具隨同IIS Lockdown工具一起發行,它的功能是禁止向Web服務器發送非法的請求。默認情況下,UrlScan工具認為包含執行文件的URL都是非法的,因此假如Web服務器上安裝了UrlScan,對http://localhost/CodeDownloadDemo/loader.exe的訪問將被禁止。 要檢查系統中是否已經安裝了UrlScan工具,可以在控制面板中打開“添加或刪除程序”,查看“當前安裝的程序”清單。 另外,我們還可以修改UrlScan的默認配置,使其答應對執行文件的請求,即修改一下UrlScan用來檢測合法/非法請求的INI配置文件。UrlScan的配置文件保存在c:/windows/system32/inetsvr/urlscan/urlscan.ini,下面是該文件的一個片斷: [DenyExtensions] ; Deny executables that could ; run on the server .was_exe .bat .cmd .com 這個配置文件片斷中,.exe文件擴展名已經改成了.was_exe,表示.exe擴展名不再被禁止。但必須注重的是,這是解除UrlScan限制的一種簡便方法,可能帶來安全風險。對于正式為用戶提供服務的Web服務器,修改配置之前務必閱讀UrlScan的文檔或詢問網絡治理員。 修改UrlScan的INI配置文件之后,必須重新啟動IIS服務器,才能讓修改生效。例如,在命令行環境中執行IISRESET.exe就可以重新啟動IIS服務器。 三、自動部署應用程序的其余部分 前面我們了解了如何自動部署一個執行文件,這種辦法對于loader(約45 KB)之類的小型應用程序有效,但通常的應用程序都要大于45 KB,例如,假如應用程序有3 MB,我們不應該讓用戶每次運行時都重新下載一個3 MB的文件。解決這個問題需要用到.NET自動部署機制的第二部分技術。 和前面的辦法相比,一種更好的辦法是將主執行程序安裝到用戶的硬盤上,讓這個主執行程序按需下載應用程序的其余部分。例如,當用戶要用到應用程序的Invoicing模塊時就下載Invoicing部分,要用到Employees模塊時就下載Employees部分(參見圖2)。
圖2:自動部署一個應用程序
這種類型的部署通常稱為“滴流”部署(Tickle Down Deployment)。.NET框架提供了支持滴流布署技術的必要工具類,即System.Reflection名稱空間中的Assembly。Assembly類能夠從遠程服務器下載一個程序集,并在本地緩沖以供以后引用。例如,利用下面的代碼可以從http://localhost/CodeDownloadDemo/Loader/下載ModuleA.dll程序集,然后從該程序集創建EmployeeForm類的實例: '指定URL Dim URL As String URL = _ "http://localhost/CodeDownLoadDemo/ModuleA.DLL" '從指定的URL裝入程序集 Dim a As [Assembly] a = [Assembly].LoadFrom(URL) '獲得一個EmployeeForm類的引用 Dim t As Type = a.GetType("ModuleA.EmployeeForm") '創建窗體的實例,并顯示出窗體 Dim o As Object = Activator.CreateInstance(t) o.Show() 這個代碼片斷雖然簡單,卻用到了.NET框架許多值得關注的特性。下面我們就來逐一分析這些特性。 首先,[Assembly].LoadFrom這行代碼利用HTTP協議下載一個DLL。在本例中,URL指向localhost,但它同樣也可以指向一個遠程服務器,例如http://www.mycompany.com/myapp。這就是說,我們只要一行代碼,并指定一個適當的URL,其余工作就全交給.NET了,不管程序集是本地的還是遠程的。 其次,從遠程服務器下載得到一個DLL之后,a.GetType這行代碼從該DLL提取一個類的引用。注重,類的名稱以字符串的形式指定,這意味著,我們可以在運行時臨時決定要引用的類的名稱。這一點非常重要,因為現在我們可以在運行時決定要引用的是ModuleA.EmployeeForm,還是ModuleA.InvoiceForm。對于VB.NET和C#之類強類型的語言,這一特性顯得尤其寶貴,它提供的靈活性是這類語言中非常罕見的。 最后,Activator.CreateInstance(t)這行代碼實際創建了EmployeeForm類的一個實例。有了類的實例之后,接下來就可以調用它的方法,設置它的屬性。在上面的例子中,我們調用了EmployeeForm類的Show方法。 四、localhost與127.0.0.1的區別 當我們指定的URL是“http://localhost”形式時,前面兩節介紹的辦法都不會出現問題。但是,假如我們改用http://127.0.0.1形式的URL,就會碰到問題。例如,假如用http://127.0.0.1/CodeDownloadDemo/loader.exe這個URL來打開loader.exe,就會看到類似圖3的錯誤信息: