下面我们运行一下本文下载包中的一个.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的错误信息: