使用 Visual Studio ASP.NET Web 部署:故障排除

作者 :Tom Dykstra

下载初学者项目

本教程系列介绍如何使用 Visual Studio 2012 或 Visual Studio 2010 将 (发布) ASP.NET Web 应用程序部署到Azure 应用服务 Web 应用或第三方托管提供程序。 有关该系列的信息,请参阅 系列中的第一个教程

本页介绍使用 Visual Studio 部署 ASP.NET Web 应用程序时可能出现的一些常见问题。 对于每个原因,都提供了一个或多个可能的原因和相应的解决方案。

所示方案适用于 Azure 和第三方托管提供程序。 有关对 Azure 应用服务中的 Web 应用进行故障排除的详细信息,请参阅以下资源:

“/”应用程序中的服务器错误 - 当前自定义错误设置阻止远程查看错误的详细信息

场景

将站点部署到远程主机后,会收到一条错误消息,其中提到 Web.config 文件中的 customErrors 设置,但未指示错误的实际原因:

Server Error in '/' Application.
Runtime Error 

Description: An application error occurred on the server. The current custom error settings 
for this application prevent the details of the application error from being viewed remotely 
(for security reasons). It could, however, be viewed by browsers running on the local server 
machine. 

Details: To enable the details of this specific error message to be viewable on remote machines,
please create a <customErrors> tag within a "web.config" configuration file located in the
root directory of the current web application. This <customErrors> tag should then have its
"mode" attribute set to "Off".

可能的原因和解决方案

默认情况下,仅当 Web 应用程序在本地计算机上运行时,ASP.NET 才会显示详细的错误信息。 通常,当 Web 应用程序通过 Internet 公开时,你不希望显示详细的错误信息,因为黑客可能能够使用此信息来查找应用程序中的漏洞。 但是,在将站点或更新部署到站点时,有时会出现错误,需要获取实际的错误消息。

若要使应用程序能够在远程主机上运行时显示详细的错误消息,请编辑Web.config文件以关闭 customErrors 模式,重新部署应用程序,然后再次运行应用程序:

  1. 如果应用程序Web.config文件在 system.web 元素中具有 customErrors 元素,请将 mode 属性更改为“off”。 否则,将 mode 属性设置为“off”的 system.web 元素中添加 customErrors 元素,如以下示例所示:

    <configuration>
      <system.web>
        <customErrors mode="off"/>
      </system.web>
    </configuration>
    
  2. 部署应用程序。

  3. 运行应用程序并重复之前导致错误发生的任何操作。 现在可以看到实际的错误消息。

  4. 解决错误后,请还原原始 customErrors 设置并重新部署应用程序。

如果该文件已存在,则无法创建/隐藏副本“ContosoUniversity”。

场景

尝试在 Visual Studio 中运行项目时,会收到一个错误页,其中包含类似于以下示例的消息:

'/' 应用程序中出现服务器错误。 如果该文件已存在,则无法创建/隐藏副本“ContosoUniversity”。

可能的原因和解决方案

请稍等片刻,刷新浏览器,或重新编译站点,然后再次尝试运行。

在使用SQL Server Compact的网页中拒绝访问

场景

部署使用 SQL Server Compact的站点并在访问数据库的已部署站点中运行页面时,会看到以下错误消息:

访问被拒绝。 (HRESULT 异常: 0x80070005 (E_ACCESSDENIED))

可能的原因和解决方案

服务器上的网络服务帐户需要能够读取 bin\amd64 或 bin\x86 文件夹中的 SQL Service Compact 本机二进制文件,但它没有对这些文件夹的读取权限。 对 bin 文件夹设置 NETWORK SERVICE 的读取权限,确保将权限扩展到子文件夹。

由于权限不足,无法读取配置文件

场景

单击“Visual Studio 发布”按钮将应用程序部署到本地计算机上的 IIS 时,发布会失败, 并且“输出 ”窗口会显示如下所示的错误消息:

读取 IIS 配置文件“MACHINE/重定向”时出错。 执行此操作的标识为 ...错误:由于权限不足,无法读取配置文件。

可能的原因和解决方案

若要在本地计算机上使用一键式发布到 IIS,必须运行具有管理员权限的 Visual Studio。 关闭 Visual Studio 并使用管理员权限重启它。

无法连接到目标计算机...使用指定进程

场景

单击“Visual Studio 发布”按钮部署应用程序时,发布会失败, 并且“输出 ”窗口会显示如下所示的错误消息:

Web deployment task failed.(Could not connect to the destination computer ("<server URL>") using the specified process
("The Web Management Service"). This can happen if a proxy server is interrupting communication with the destination server. 
Disable the proxy server and try again.) ... The remote server returned an error: (502) Bad Gateway.

可能的原因和解决方案

代理服务器正在中断与目标服务器的通信。 在 Windows 控制面板或 Internet Explorer 中,选择“Internet 选项”,然后选择“连接”选项卡。在“Internet 属性”对话框中,单击“LAN 设置”。 在“ 局域网 (LAN) 设置” 对话框中,清除“ 自动检测设置 ”复选框。 然后再次单击“发布”按钮。

如果问题仍然存在,请与系统管理员联系,以确定代理或防火墙设置可以执行的操作。 出现此问题的原因是 Web 部署使用非标准端口进行 Web 管理服务部署 (8172) ;对于其他连接,Web 部署使用端口 80。 部署到第三方托管提供程序时,通常使用 Web 管理服务。

默认 .NET 4.0 应用程序池不存在

场景

部署需要 .NET Framework 4 的应用程序时,会看到以下错误消息:

默认的 .NET 4.0 应用程序池不存在,或者无法添加该应用程序。 请验证此计算机上是否安装了 ASP.NET 4.0。

可能的原因和解决方案

ASP.NET 4 未安装在 IIS 中。 如果要部署到的服务器是开发计算机,并且其中安装了 Visual Studio 2010,则计算机上已安装 ASP.NET 4,但可能不会安装在 IIS 中。 在要部署到的服务器上,打开提升的命令提示符,并通过运行以下命令在 IIS 中安装 ASP.NET 4:

cd %windir%\Microsoft.NET\Framework\v4.0.30319
aspnet_regiis.exe –iru

可能还需要手动设置默认应用程序池的.NET Framework版本。 有关详细信息,请参阅本系列中的部署到 IIS 作为测试环境教程。

初始化字符串的格式不符合从索引 0 开始的规范。

场景

使用一键发布部署应用程序后,运行访问数据库的页面时,会收到以下错误消息:

初始化字符串的格式不符合从索引 0 开始的规范。

可能的原因和解决方案

在部署的站点中打开 Web.config 文件,检查以查看连接字符串值是否以 $(ReplaceableToken_开头,如以下示例所示:

<connectionStrings>
  <add name="DefaultConnection" connectionString="$(ReplaceableToken_DefaultConnection-Web.config Connection String_0)" providerName="System.Data.SqlServerCe.4.0" />
  <add name="SchoolContext" connectionString="$(ReplaceableToken_SchoolContext-Web.config Connection String_0)" providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>

如果连接字符串与此示例类似,请编辑项目文件,并将以下属性添加到用于所有生成配置的 PropertyGroup 元素:

<AutoParameterizationWebConfigConnectionStrings>False</AutoParameterizationWebConfigConnectionStrings>

然后重新部署应用程序。

HTTP 500 内部服务器错误

场景

运行部署的站点时,会看到以下错误消息,但没有指示错误原因的特定信息:

HTTP 错误 500 - 内部服务器错误。

可能的原因和解决方案

500 个错误的原因有很多,但如果按照这些教程进行操作,则其中一个可能的原因是将 XML 元素放置在某个Web.config转换文件中的错误位置。 例如,如果将位置元素插入到 system.web> 下而不是直接在配置>下<<插入<位置>元素的转换,则会收到此错误。 可以使用Web.config转换预览功能来验证转换是否按预期工作。 如果发现编码错误的转换,解决方案是更正转换文件并重新部署。 如果错误不明显,请尝试注释掉转换并重新部署,以查看导致 500 错误的转换。

HTTP 500.21 内部服务器错误

场景

运行部署的站点时,会看到以下错误消息:

HTTP 错误 500.21 - 内部服务器错误。 处理程序“PageHandlerFactory-Integrated”的模块列表中有一个错误的模块“ManagedPipelineHandler”。

可能的原因和解决方案

已部署的目标站点 ASP.NET 4,但 ASP.NET 4 未在服务器上的 IIS 中注册。 在服务器上打开提升的命令提示符,并通过运行以下命令 ASP.NET 4 注册:

cd %windir%\Microsoft.NET\Framework\v4.0.30319
aspnet_regiis.exe –iru

可能还需要手动设置默认应用程序池的.NET Framework版本。 有关详细信息,请参阅本系列中的部署到 IIS 作为测试环境教程。

登录在 App_Data 中打开SQL Server Express数据库失败

场景

你更新了Web.config文件连接字符串以指向 App_Data 文件夹中的 .mdf 文件的SQL Server Express数据库,并且首次运行应用程序时会看到以下错误消息:

System.Data.SqlClient.SqlException:无法打开登录请求的数据库“DatabaseName”。 登录失败。

可能的原因和解决方案

.mdf 文件的名称不能与计算机上曾经存在过的任何SQL Server Express数据库的名称匹配,即使你删除了以前存在的数据库的 .mdf 文件也是如此。 将 .mdf 文件的名称更改为从未用作数据库名称的名称,并将 Web.config 文件更改为使用新名称。 或者,可以使用 SQL Server Management Studio Express 删除以前存在的SQL Server Express数据库。

无法检查模型兼容性

场景

更新了Web.config 文件连接字符串以指向新的 SQL Server Express 数据库,首次运行应用程序时,会看到以下错误消息:

无法检查模型兼容性,因为数据库不包含模型元数据。 确保 IncludeMetadataConvention 已添加到 DbModelBuilder 约定。

可能的原因和解决方案

如果放入 Web.config 文件的数据库名称以前曾在计算机上使用过,则数据库中可能已存在某些表。 选择计算机上以前未使用过的新名称,并将 Web.config 文件更改为指向以使用此新数据库名称。 或者,可以使用 SQL Server Express 实用工具SQL Server Management Studio Express 删除现有数据库。

脚本尝试创建用户或角色时出现 SQL 错误

场景

你使用的是在 “包/发布 SQL ”选项卡上配置的数据库部署,部署期间运行的 SQL 脚本包括“创建用户”或“创建角色”命令,执行这些命令时脚本执行失败。 你可能会看到更详细的消息,如下所示:

The approximate location of the error was between lines '1' and '3' of the script. 
The verbose log may have more information about the error. The command started with:
CREATE USER [user2] FOR LOGIN [user2] WITH DEFAULT
Error: User does not have permission to perform this action.

如果在 “发布 Web 向导”而不是“ 包/发布 SQL ”选项卡中配置数据库部署时发生此错误,请在 “配置和部署 ”论坛中创建一个线程,并将解决方案添加到此故障排除页。

可能的原因和解决方案

用于执行部署的用户帐户没有创建用户或角色的权限。 例如,托管公司可能会将db_datareader、db_datawriter和db_ddladmin角色分配给它为你设置的用户帐户。 这些足以创建大多数数据库对象,但不适用于创建用户或角色。 避免此错误的一种方法是从数据库部署中排除用户和角色。 为此,可以编辑数据库自动生成的脚本的 PreSource 元素,使其包含以下属性:

CopyAllUsers=false, CopyAllRoles=false

有关如何编辑项目文件中的 PreSource 元素的信息,请参阅 如何:编辑项目文件中的部署设置。 如果开发数据库中的用户或角色需要位于目标数据库中,请与托管提供商联系以获取帮助。

在部署期间运行自定义脚本时SQL Server超时错误

场景

你已指定要在部署期间运行的自定义 SQL 脚本,当 Web 部署运行它们时,它们会超时。

可能的原因和解决方案

运行具有不同事务模式的多个脚本可能会导致超时错误。 默认情况下,自动生成的脚本在事务中运行,但自定义脚本不会运行。 如果在“打包/发布 SQL”选项卡上选择“从现有数据库拉取数据和/或架构”选项,并且添加自定义 SQL 脚本,则必须更改某些脚本上的事务设置,以便所有脚本使用相同的事务设置。 有关详细信息,请参阅 如何:使用 Web 应用程序项目部署数据库

如果已配置事务设置,使所有设置相同但仍出现此错误,则可能的解决方法是单独运行脚本。 在“包/发布 SQL”选项卡的“数据库脚本”网格中,清除导致超时错误的脚本的“包含检查”框,然后发布项目。 然后返回到“数据库脚本”网格,选择该脚本的“包含检查”框,并清除其他脚本的“包括检查”框。 然后再次发布项目。 这次发布时,仅运行选定的自定义脚本。

网站清单的流数据尚不可用

场景

使用带有 t (测试) 选项的 deploy.cmd 文件安装包时,会看到以下错误消息:

错误:“sitemanifest/dbFullSql[@path='C:\TEMP\AdventureWorksGrant.sql']/sqlScript”的流数据尚不可用。

可能的原因和解决方案

错误消息表示命令无法生成测试报告。 但是,如果使用 y (实际安装) 选项,则命令可能会运行。 该消息仅指示在测试模式下运行命令存在问题。

此应用程序需要 ManagedRuntimeVersion v4.0

场景

尝试部署时,会看到以下错误消息:

尝试使用的应用程序池的“managedRuntimeVersion”属性设置为“v2.0”。 此应用程序需要“v4.0”。

可能的原因和解决方案

ASP.NET 4 未安装在 IIS 中。 如果要部署到的服务器是开发计算机,并且其中安装了 Visual Studio 2010,则计算机上已安装 ASP.NET 4,但可能不会安装在 IIS 中。 在要部署到的服务器上,打开提升的命令提示符,并通过运行以下命令在 IIS 中安装 ASP.NET 4:

cd %windir%\Microsoft.NET\Framework\v4.0.30319
aspnet_regiis.exe –i

无法强制转换 Microsoft.Web.Deployment.DeploymentProviderOptions

场景

部署包时,会看到以下错误消息:

无法将类型为“Microsoft.Web.Deployment.DeploymentProviderOptions”的对象转换为“Microsoft.Web.Deployment.DeploymentProviderOptions”。

可能的原因和解决方案

尝试使用 Web 部署 1.1 UI 从 IIS 管理器部署到安装了 Web Deploy 2.0 的服务器。 如果使用 IIS 远程管理工具通过导入包进行部署,请在建立连接时检查“可用新功能”对话框。 (首次建立连接时,此对话框可能仅显示一次。若要清除连接并重新开始,请关闭 IIS 管理器,然后在命令提示符处输入 inetmgr /reset 来重新启动它。) 如果列出的功能之一是 Web 部署 UI,并且其版本号低于 8,则部署到的服务器可能同时安装了 1.1 和 2.0 版本的 Web 部署。 若要从安装了 2.0 的客户端进行部署,服务器必须仅安装 Web 部署 2.0。 必须联系托管提供商来解决此问题。

无法加载 SQL Server Compact 的本机组件

场景

运行部署的站点时,会看到以下错误消息:

无法加载与版本 8482 的 ADO.NET 提供程序对应的SQL Server Compact的本机组件。 安装正确版本的 SQL Server Compact。 有关更多详细信息,请参阅知识库文章974247。

可能的原因和解决方案

部署的站点没有 amd64x86 子文件夹,其中包含应用程序的 bin 文件夹下的本机程序集。 在安装了 SQL Server Compact 的计算机上,本机程序集位于 C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private 中。 若要在 Visual Studio 项目中将正确的文件获取到正确的文件夹中,最佳方法是安装 NuGet SqlServerCompact 包。 包安装添加了一个生成后脚本,用于将本机程序集复制到 amd64x86。 但是,若要部署它们,必须手动将它们包含在项目中。 有关详细信息,请参阅部署SQL Server Compact教程。

部署 Entity Framework Code First 应用程序后出现“路径无效”错误

场景

部署使用 Entity Framework Code First 迁移 和 DBMS(如 SQL Server Compact)的应用程序,它将数据库存储在 App_Data 文件夹中的文件中。 Code First 迁移配置为在首次部署后创建数据库。 运行应用程序时,会收到类似于以下示例的错误消息:

该路径无效。 检查数据库的目录。 [Path = c:\inetpub\wwwroot\App_Data\DatabaseName.sdf ]

可能的原因和解决方案

Code First 正在尝试创建数据库,但App_Data文件夹不存在。 部署时,App_Data文件夹中没有任何文件,或者在项目属性窗口的“包/发布 Web”选项卡上选择了“排除App_Data”。 如果文件夹中没有要复制到服务器的文件,则部署过程不会在服务器上创建文件夹。 如果已在站点中设置了数据库,则如果在发布配置文件中选择了“删除目标处的其他文件”,则部署过程将删除文件和App_Data文件夹本身。 若要解决此问题,请将占位符文件(如 .txt 文件)放在 App_Data 文件夹中,确保未选择 “排除App_Data ”,然后重新部署。

“不能使用已与其基础 RCW 分离的 COM 对象。”

场景

已成功使用一键式发布部署应用程序,然后开始收到此错误:

Web 部署任务失败。 (无法完成对远程代理 URL“”<https://serverurl.com/msdeploy.axd?site=sitename>的请求。)
无法完成对远程代理 URL“”<https://url/msdeploy.axd?site=sitename>的请求。
请求已中止:请求已取消。
不能使用已与其基础 RCW 分离的 COM 对象。

可能的原因和解决方案

关闭并重启 Visual Studio 通常是解决此错误所需的全部操作。

部署失败,因为用于发布的用户凭据没有 setACL 颁发机构

场景

发布失败,并显示一个错误,指示你无权设置文件夹权限 (所使用的用户帐户没有 setACL 权限) 。

可能的原因和解决方案

默认情况下,Visual Studio 对网站的根文件夹设置读取权限,对App_Data文件夹设置写入权限。 如果您知道网站文件夹的默认权限正确且不需要设置,则可通过将 IncludeSetACLProviderOn Destination>False</IncludeSetACLProviderOnDestination> 添加到<发布配置文件 (以影响单个配置文件) ,或添加到 wpp.targets 文件 (以影响所有配置文件) 来禁用此行为。 有关如何编辑这些文件的信息,请参阅 如何:在配置文件 (.pubxml) 文件中编辑部署设置

应用程序尝试写入应用程序文件夹时出现的拒绝访问错误

场景

应用程序尝试在其中一个应用程序文件夹中创建或编辑文件时出错,因为它没有该文件夹的写入权限。

可能的原因和解决方案

默认情况下,Visual Studio 对网站的根文件夹设置读取权限,对App_Data文件夹设置写入权限。 如果应用程序需要对子文件夹的写入访问权限,则可以设置该文件夹的权限,如本系列中的设置文件夹权限和部署到生产环境教程所示。 如果应用程序需要对站点根文件夹的写入访问权限,则必须通过将 IncludeSetACLProviderOn Destination>False</IncludeSetACLProviderOnDestination> 添加到<发布配置文件 (以影响单个配置文件) 或 wpp.targets 文件 (来影响所有配置文件) ,从而阻止对根文件夹设置只读访问权限。 有关如何编辑这些文件的信息,请参阅 如何:在配置文件 (.pubxml) 文件中编辑部署设置

配置错误 - targetFramework 属性引用的版本高于已安装版本的 .NET Framework

场景

已成功发布面向 ASP.NET 4.5 的 Web 项目,但在Web.config 文件中将 customErrors 模式设置为“off”的情况下运行应用程序 (时,) 收到以下错误:

Web.config 文件的编译元素中的<“targetFramework”属性仅用于面向.NET Framework (版本 4.0 及更高版本,例如,“<compilation targetFramework=”4.0“>>) 。 “targetFramework”属性当前引用的版本高于安装版本的.NET Framework。 指定.NET Framework的有效目标版本,或安装所需版本的.NET Framework。

错误页的“源错误”框突出显示了Web.config的以下行作为错误原因:

<compilation targetFramework=“4.5” />

可能的原因和解决方案

服务器不支持 ASP.NET 4.5。 请联系托管提供商,以确定何时以及是否可以添加对 ASP.NET 4.5 的支持。 如果无法升级服务器,则必须部署面向 ASP.NET 4 或更早版本的 Web 项目。

如果将 ASP.NET 4 或更早版本的 Web 项目部署到同一目标,请在“发布 Web”向导的“设置”选项卡上选择“删除目标检查的其他文件”框。 如果未选择“ 在目标位置删除其他文件”,将继续获取“配置错误”页。

项目“属性”窗口包含“目标框架”下拉列表,但仅通过将 .NET Framework 4.5 更改为 .NET Framework 4 无法解决此问题。 如果将目标框架更改为早期框架版本,则项目仍将引用更高框架版本的程序集,并且不会运行。 必须手动更改这些引用或创建一个面向.NET Framework 4 或更早版本的新项目。 有关详细信息,请参阅网站.NET Framework目标

中等信任错误

场景

在生产环境中运行应用程序时,会收到与中等信任相关的错误。

可能的原因和解决方案

许多第三方托管提供商以中等信任方式运行网站,这意味着有些操作是不允许执行的。 例如,应用程序代码无法访问 Windows 注册表,并且无法读取或写入应用程序的文件夹层次结构之外的文件。 默认情况下,应用程序在本地计算机上 以完全信任 的方式运行,这意味着应用程序可能能够执行将应用程序部署到生产环境时会失败的操作。

可以将应用程序配置为在本地 IIS 环境中以中等信任方式运行,以便进行故障排除。 为此,请打开应用程序Web.config文件,并在 system.web 元素中添加信任元素,如以下示例所示。

<configuration>
  <!-- Settings -->
  <system.web>
    <trust level="Medium" />
    <!-- Settings -->
  </system.web>
</configuration>

现在,即使在本地计算机上,应用程序也将在 IIS 中以中等信任方式运行。

如果要部署到 Azure 应用服务,请不要这样做,因为 Azure 不需要中等信任。 在 2012 年 2 月编写本教程时,使用此方法使应用程序在中等信任中运行将导致 Azure 中出现错误。

如果使用 Entity Framework Code First 迁移并且要部署到以中等信任方式运行应用程序的托管提供程序,请确保已安装版本 5.0 或更高版本。 在 Entity Framework 版本 4.3 中,迁移需要完全信任才能更新数据库架构。

HTTP 404.17 找不到错误

场景

在 IIS 中的开发计算机上运行部署的站点时,会看到以下错误消息,指出服务器无法处理 Default.aspx:

HTTP 错误 404.17 - 找不到

请求的内容似乎是脚本,不会由静态文件处理程序提供服务。

可能的原因和解决方案

计算机上可能未安装 ASP.NET 4.5。 请参阅本系列教程部署到 IIS 作为测试环境中的步骤,其中介绍了如何安装 ASP.NET 4.5。