一、MIME及其类型
1、数据处理方式
当浏览器通过各种请求方法,试图从服务器获得数据的时候,服务器就必须将正确的数据返回给浏览器。浏览器并不关心服务器是如何进行处理的,服务器可以返回一个预先编辑好的HTML文档,也能根据请求动态生成返回的数据。而WWW的一大特点就是能用来传送多媒体数据,并且这些数据的传送是完全透明的,通过同样的HTTP连接,可以传送不同格式的声音、图象等数据。当服务器仅仅用于返回静态的HTML文档的时候,浏览器能够很容易的识别其数据类型,但当服务器不但用于返回静态的HTML文档,还可以动态返回各种类型的多媒体信息时,浏览器就不能仅仅从URL请求本身上判断服务器将会返回何种数据了。
服务器和浏览器之间是采用了另外的方式来标识数据的类型,这种方式下通过在传输真正的数据之前,预先传输一个数据的MIME类型的方法,来标识数据类型。
2、多媒体文件格式MIME
最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。
MIME意为多目的Internet邮件扩展,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。
每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。
常见的MIME类型:
- 超文本标记语言文本 .html,.html text/html
- 普通文本 .txt text/plain
- RTF文本 .rtf application/rtf
- GIF图形 .gif image/gif
- JPEG图形 .ipeg,.jpg image/jpeg
- au声音文件 .au audio/basic
- MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
- RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
- MPEG文件 .mpg,.mpeg video/mpeg
- AVI文件 .avi video/x-msvideo
- GZIP文件 .gz application/x-gzip
- TAR文件 .tar application/x-tar
Internet中有一个专门组织IANA来确认标准的MIME类型,但Internet发展的太快,很多应用程序等不及IANA来确认他们使用的MIME类型为标准类型。因此他们使用在类别中以x-开头的方法标识这个类别还没有成为标准,例如:x-gzip,x-tar等。事实上这些类型运用的很广泛,已经成为了事实标准。只要客户机和服务器共同承认这个MIME类型,即使它是不标准的类型也没有关系,客户程序就能根据MIME类型,采用具体的处理手段来处理数据。而Web服务器和浏览器(包括操作系统)中,缺省都设置了标准的和常见的MIME类型,只有对于不常见的 MIME类型,才需要同时设置服务器和客户浏览器,以进行识别。
由于MIME类型与文档的后缀相关,因此服务器使用文档的后缀来区分不同文件的MIME类型,服务器中必须定义文档后缀和MIME类型之间的对应关系。而客户程序从服务器上接收数据的时候,它只是从服务器接受数据流,并不了解文档的名字,因此服务器必须使用附加信息来告诉客户程序数据的MIME类型。服务器在发送真正的数据之前,就要先发送标志数据的MIME类型的信息,这个信息使用Content-type关键字进行定义,例如对于HTML文档,服务器将首先发送以下两行MIME标识信息,这个标识并不是真正的数据文件的一部分。
Content-type: text/html
注意,第二行为一个空行,这是必须的,使用这个空行的目的是将MIME信息与真正的数据内容分隔开。
3、MIME类型可参见IANA的MIME类型
二、配置Config类型文件
1、启用锁定文件扩展名的下载
IIS(Internet 信息服务)会保护某些文件类型,例如 .config 文件和 .mdb 文件。如果应用程序有锁定的文件,请执行以下操作启用对此类文件的下载:
-
在 inetmgr 中打开 vroot 的“属性”页。
-
在“虚拟目录”选项卡上单击“配置”。
您将看到一个应用程序映射列表。删除 .config 扩展名的映射以启用 .config 文件下载。对此列表中希望作为应用程序一部分下载的所有其他扩展名重复此操作。
2、添加Config类型MIME 类型映射
在 HTTP 上发布时,.application 文件的 MIME 类型应为“application/x-ms-application”。如果服务器上安装有 .NET Framework 2.0,该类型将自动设置。如果没有安装,则需要为 ClickOnce 应用程序 vroot(或整个服务器)创建 MIME 类型关联。
在 IIS 中执行此操作:
-
运行 inetmgr 并打开 vroot(或整个服务器)的“属性”页。
-
单击“HTTP 标头”选项卡。
-
单击“Mime 映射”部分中的“文件类型”按钮。
-
单击“新建类型”添加一个新类型。在“相关扩展名”中键入 config;在“内容类型 (MIME)”中键入 text/xml。
-
重新启动 IIS。
三、ClickOnce 部署的疑难解答
本主题介绍服务器必备条件,并提供 ClickOnce 部署中遇到的常见问题的指南。
启用锁定文件扩展名的下载
IIS(Internet 信息服务)会保护某些文件类型,例如 .config 文件和 .mdb 文件。如果应用程序有锁定的文件,请执行以下操作启用对此类文件的下载:
-
在 inetmgr 中打开 vroot 的“属性”页。
-
在“虚拟目录”选项卡上单击“配置”。
您将看到一个应用程序映射列表。删除 .config 扩展名的映射以启用 .config 文件下载。对此列表中希望作为应用程序一部分下载的所有其他扩展名重复此操作。
出于安全原因,有些 Web 服务器的配置会阻止不常用于 Web 内容的文件。例如,具有以下扩展名的文件可能会被阻止:.dll、.config、.mdf。基于 Windows 的应用程序通常包含带有其中一些扩展名的文件。如果用户尝试运行的 ClickOnce 应用程序要访问 Web 服务器上被阻止的文件,将产生一个错误。无需取消对所有文件扩展名的阻止,默认情况下,每个应用程序文件都使用“.deploy”文件扩展名发布。如果使用此选项,Web 服务器只需配置为允许以下三种文件扩展名即可:
-
.application
-
.manifest
-
.deploy
但是,可以禁用此选项,方法是清除“发布选项”对话框上的“使用‘deploy’文件扩展名”选项,这时必须配置 Web 服务器以允许应用程序中使用的所有文件扩展名。
有时您必须配置 .manifest、.application 和 .deploy,例如在使用未安装 .NET Framework 的 IIS 的情况下,或在使用其他 Web 服务器(例如,Apache)的情况下。
配置过期设置
通过 URL 启动应用程序时,Internet Explorer 执行 .application 文件的下载。因此,所有通知浏览器缓存文件的过期设置都将有效。客户端会因此而不检测新的更新,而是使用 IE 缓存中的 .application。若要确保客户端在每当更新可用时都立即检测更新,请启用 IIS 中的“立即过期”选项。
在 IIS 中执行此操作:
-
运行 inetmgr 并打开 vroot(或整个服务器)的“属性”页。
-
单击“HTTP 标头”选项卡。
-
单击“启用内容过期”。
-
单击“立即过期”。
-
重新启动 IIS。
不支持 FTP 协议
ClickOnce 支持从任何 HTTP 1.1 Web 服务器或文件服务器上安装应用程序。FTP 协议不受支持。可以使用 ftp:// 协议发布应用程序,但必须使用 http://、https:// 或 file:// 协议执行安装。
正确配置服务器
使用 ClickOnce 时的一个最常见的问题就是 ClickOnce 因配置问题而无法从网络服务器下载文件。如果在 ClickOnce 安装过程中遇到下载文件的问题,请尝试使用 Internet Explorer 下载相同的文件。这样将把问题范围缩小到 ClickOnce 问题,而不是普通的服务器/网络问题。
需要管理员特权
如果使用 HTTP 发布,则您必须具备目标服务器上的管理员特权(IIS 需要此特权级别)。如果不使用 HTTP 发布,则只需具备目标路径上的写权限。
必须启用匿名访问
向关闭了“匿名访问”的远程服务器发布时,您将收到下面的警告:
"The files could not be downloaded from http://<remoteserver>/<myapplication>/. The remote server returned an error: (401) Unathorized."
若要解决此问题,请在 Windows 资源管理器中右击“我的电脑”,然后选择“管理”。在“计算机管理”对话框中,依次打开“服务和应用程序”节点、“Internet 信息服务”、“网站”,然后右击“默认网站”。在“默认网站属性”对话框中,单击“目录安全性”选项卡,然后单击“编辑”按钮。在“身份验证方法”对话框中,选择“匿名访问”复选框。
Windows XP SP2:Windows 防火墙
默认情况下,Windows XP SP2 启用 Windows 防火墙。如果在安装有 Windows XP 的计算机上开发应用程序,仍能从本地 IIS 服务器发布和运行 ClickOnce 应用程序。但是,如果不打开 Windows 防火墙,则无法从其他计算机访问该 IIS 服务器。若要管理 Windows 防火墙,请从“控制面板”中选择“Windows 防火墙”。
Windows Server 2003:启用 FrontPage 服务器扩展
使用 HTTP 将应用程序发布到 Windows Web 服务器需要 FrontPage 服务器扩展 (FPSE)。
默认情况下,Windows Server 2003 不安装 FPSE。如果希望使用 Visual Studio 通过具有 FPSE 的 HTTP 将应用程序发布到 Windows Server 2003 Web 服务器,必须先安装 FPSE。可以使用 Windows Server 2003 中的“管理您的服务器”管理工具完成此工作。
MIME 类型映射
在 HTTP 上发布时,.application 文件的 MIME 类型应为“application/x-ms-application”。如果服务器上安装有 .NET Framework 2.0,该类型将自动设置。如果没有安装,则需要为 ClickOnce 应用程序 vroot(或整个服务器)创建 MIME 类型关联。
在 IIS 中执行此操作:
-
运行 inetmgr 并打开 vroot(或整个服务器)的“属性”页。
-
单击“HTTP 标头”选项卡。
-
单击“Mime 映射”部分中的“文件类型”按钮。
-
单击“新建类型”添加一个新类型。在“相关扩展名”中键入 application;在“内容类型 (MIME)”中键入 application/x-ms-application。
-
重新启动 IIS。
Windows Server 2003:锁定的 MIME 类型
Windows Server 2003 上的 IIS 会锁定除某些已知类型(例如 .htm、.html、.txt 等)以外的所有文件类型。要使用此服务器部署 ClickOnce 应用程序,需要更改 IIS 设置以允许下载 .application、.manifest 以及应用程序使用的所有其他自定义文件类型的文件。
在 IIS 中执行此操作:
-
运行 inetmgr 并打开该计算机节点的“属性”页。
-
单击“MIME 类型”按钮。
-
单击“新建”按钮,然后添加新的扩展名和必要的 MIME 类型。
对于 .application 和 .manifest 扩展名,MIME 类型应为“application/x-ms-application”。对于其他文件类型,MIME 类型应为“application/octet-stream”。
如果创建带有扩展名“*”且 MIME 类型为“application/octet-stream”的 MIME 类型,将允许下载未阻止的文件类型的文件。(但是不能下载阻止的文件类型,例如 .aspx 和 .asmx)。
-
重新启动 IIS。
使用 ClickOnce 错误日志
-
发生 ClickOnce 错误时,通常会显示一个带有“详细信息”按钮的错误对话框。单击此按钮将打开该应用程序的 ClickOnce 日志文件。请在此日志文件中查找特定错误信息,该信息将指出何处出错。如果其中的信息不足以帮助诊断和解决问题,请参考本疑难解答指南中的以下内容。
-
ClickOnce 为每个应用程序维护一个日志文件。该文件存储在 wininet 缓存中,因此适用于自动清理机制。
-
指定自定义日志位置:要使 ClickOnce 将日志写入到特定位置,请将注册表项 [HKCU\Software\Microsoft\Windows\CurrentVersion\Deployment] "LogFilePath" (STRING) 设置为一个文件,例如“c:\logs\ClickOnceLog.txt”。确保计算机上存在此目录 (c:\logs)。所有应用程序的全部 ClickOnce 日志消息都将写入此文件。
手动更改清单或应用程序时的注意事项
Visual Studio 发布负责设置应用程序和清单。但是,如果在 Visual Studio 以外更新部署(例如使用 MAGE),则需注意一些问题:
-
如果更新应用程序中的文件,则必须更新应用程序清单中对该文件的引用,因为该文件将更改。
-
如果以任何方式更新应用程序清单,则必须在部署清单中更新应用程序清单引用。当使用 MageUI 在部署清单中更新应用程序清单引用时,请确保基本代码指向您的应用程序清单。MageUI 始终假定应用程序清单是一个带有版本的子目录,而这一假定不一定总是正确的。
-
如果以任何方式更新清单,则必须再次对它签名。
使用部署提供程序的注意事项
这里介绍当您在客户端发现 ClickOnce 应用程序出现意外行为时应注意的问题。ClickOnce 部署清单具有一个 deploymentProvider 属性,该属性指向安装应用程序和为应用程序提供服务的源位置的完整路径。
在部署清单中查找下面一行:
<deploymentProvider codebase="http://myserver/myapp.application" />
这行内容是在创建 ClickOnce 应用程序时设置的,对于“安装的”应用程序,这是必需的设置。该设置中的位置是一个标准位置,ClickOnce 安装程序从该位置安装应用程序和查找更新。所有应用程序文件都将从相对于此路径的位置安装。
因此,如果使用 xcopy 命令将 ClickOnce 应用程序复制到不同位置,但不更改 deploymentProvider 属性,则尝试下载应用程序时 ClickOnce 仍将引用原始位置。
如果希望移动或复制应用程序,则必须也更新 deploymentProvider 路径,这样客户端才能确实从新位置安装。对“安装的”应用程序来说这是个普遍问题。对于始终通过原始 URL 启动的联机应用程序,deploymentProvider 为可选设置。如果设置了 deploymentProvider,则使用该属性,否则将使用用于激活应用程序的 URL 作为基 URL 下载应用程序文件。
请记住:每次更新清单时,必须再次对它签名。
应用程序启动和更新问题
问题:浏览至一个 .application 文件时无任何反应,或者 XML 呈现在 IE 中,或者出现“运行/另存为”对话框
解决方法:很可能是因为 MIME 类型未在服务器或客户端上正确注册。
首先进行检查,以确保服务器配置为将 .application 扩展名与 MIME 类型“application/x-ms-application”相关联(请参见上面的“服务器配置”了解详细信息)。如果服务器配置正确,则检查以确保计算机上安装了 .NET Framework 2.0。如果已安装 dnprdnlong 但仍出现该问题,请尝试卸载并重新安装 Framework,以在客户端重新注册 MIME 类型。
问题:错误对话框显示“无法检索应用程序。部署中缺少文件”或“应用程序下载中断,请检查网络错误并稍后再试”
解决方法:这表示无法下载 ClickOnce 清单所引用的一个或多个文件。调试此问题最简单的方法是尝试下载 ClickOnce 指出其无法下载的 URL。可能的原因如下:
-
如果日志文件显示“(403) Forbidden”或“(404) Not found”,请检查以确保 Web 服务器配置为不阻止此文件的下载(请参见上面的“服务器配置”部分)。
-
如果服务器阻止了 .config 文件,请参见下面的“问题:安装具有 .config 文件的 ClickOnce 应用程序时发生下载错误”。
-
请检查是否由于部署清单中的 deploymentProvider URL 指向的位置不是用于激活应用程序的 URL 而导致了此问题(有关更多信息,请参见上面的“使用部署提供程序的注意事项”)。
-
请检查服务器以确保所有文件都存在;ClickOnce 日志会指出找不到的文件。
-
检查是否存在网络连接问题;如果下载期间客户端计算机脱机,您将收到此消息。
问题:安装具有 .config 文件的 ClickOnce 应用程序时发生下载错误
基于 Visual Basic Windows 的应用程序默认包含一个 app.config 文件。当用户尝试从安装有 Windows Server 2003 的 Web 服务器安装时将出现问题,原因是该操作系统会出于安全原因而阻止安装 .config 文件。要允许安装 .config 文件,请单击“发布选项”对话框中的“使用‘.deploy’文件扩展名”。
还需要相应地设置 MIME 类型。如果在使用 IIS,请在 Windows 资源管理器中右击“我的电脑”,再选择“管理”。依次打开“服务和应用程序”、“Internet 信息服务”,再右击“网站”,然后选择“属性”。
单击标签为“MIME 类型”的按钮。在“MIME 类型”对话框中,为 .application、.manifest 和 .deploy 文件添加 MIME 类型。
有关更多信息,请参见上面的“服务器配置”部分中的“启用锁定文件扩展名的下载”。
问题:错误信息“应用程序格式不正确”;日志文件包含“XML 签名无效”
解决方法:确保更新了清单文件并再次对它签名。使用 Visual Studio 重新发布应用程序,或使用 Mage 再次对该应用程序进行签名。
问题:安全警告“应用程序已被阻止,因为它会对计算机造成很高的安全风险”
解决方法:如果 Internet 上未签名的应用程序请求升级的信任,通常会出现此对话框。若要允许安装和运行此应用程序,请将该 URL 添加到受信任站点列表。可以在 Internet Explorer 中使用“Internet 选项”对话框中的“安全”选项卡完成此操作。
问题:我在服务器上更新了应用程序,但客户端不下载更新
解决方法:可能存在以下原因之一
-
请检查部署清单中的 deploymentProvider URL。您是否确定更新内容所在的位置与 deploymentProvider 指向的位置相同?(有关更多信息,请参见上面的“使用部署提供程序的注意事项”。)
-
请检查部署清单中的更新间隔。如果设置的间隔为阶段性间隔(例如每六小时一次),ClickOnce 会一直等到此间隔过后才检查更新。可以更改清单,使之在每次应用程序启动时检查更新。在开发时可以使用这一选项方便地验证是否正在安装更新,但这会减慢应用程序的激活速度。
-
尝试从“开始”菜单重新启动应用程序。ClickOnce 可能已在后台检测到更新,但将在下次激活时提示您安装。
问题:更新期间遇到错误,日志项记录“部署中的引用与应用程序清单中定义的标识不匹配”
解决方法:发生问题的原因可能是 ClickOnce 当前使用的是 Internet Explorer 缓存的较旧版本的部署清单,而该版本与服务器上的最新应用程序清单不匹配。为避免此问题,建议将服务器 vroot(或部署清单)上的 IIS 设置更改为立即过期,此设置会强制在每次激活时检查服务器。若要在 inetmgr 中进行此操作,请选择 vroot“属性”页上的“HTTP 标头”选项卡,然后选中“启用内容过期”框,并设置为“立即过期”。
或者,可以先重新启动 Internet Explorer 或清除 Internet Explorer 的“Temporary Internet Files”文件夹,然后再次运行该应用程序,这将导致一次服务器重新同步。
问题:首次从本地磁盘(或 CD-ROM)激活成功,但之后从“开始”菜单激活失败
解决方法:ClickOnce 使用部署提供程序 URL 获取应用程序的更新。请检查以确保该 URL 指向的位置正确。(有关更多信息,请参见上面的“部署提供程序”。)
问题:错误“无法终结应用程序”
解决方法:此错误信息通常表示将该应用程序安装到 ClickOnce 存储区时出错。要么是应用程序出错,要么是存储区损坏。日志文件对出错位置可能会有更好的指示。
要检查的内容:
-
检查部署清单的标识、应用程序清单的标识和主应用程序 EXE 的标识是否都唯一。
-
如果应用程序包含的文件路径过长(超过 100 个字符),则可能超出了存储区的最大路径限制。请尝试缩短路径并重新安装。
问题:应用程序配置文件中的 PrivatePath 设置不起作用
解决方法:要使用 PrivatePath(合成探测路径),应用程序需要获得完全信任权限。请尝试将应用程序清单更改为请求完全信任,然后重试。
问题:卸载期间出现对话框“未能卸载应用程序”
解决方法:这通常表示应用程序已经删除或存储区已损坏。单击“确定”后,“添加/删除程序”项将被删除。
问题:安装期间出现对话框,提示没有安装平台依赖项
解决方法:GAC(全局程序集缓存)中缺少应用程序运行所需的一个必备项。
使用 Visual Studio 发布
问题:在 Visual Studio 中发布时失败
请确保您具备面向目标服务器的发布权限。例如,如果您作为普通用户而不是管理员登录到终端服务器计算机,则您可能没有权限发布到本地 Web 服务器。
如果使用 URL 发布,请确保目标计算机上启用了 FrontPage 服务器扩展。
使用 Mage
问题:我尝试使用证书存储区中的证书进行签名,但收到一个空白消息框
您需要在“签名”对话框中执行以下操作:
-
选择“使用存储的证书进行签名”,然后
-
从列表中选择一个证书;不会自动选择第一个证书。
问题:单击“不签名”按钮时导致异常
这是一个已知 bug。所有 ClickOnce 清单都需要进行签名。只需选择其中一个签名选项,然后单击“确定”即可。