使用 Visual Studio 或 Visual Web Developer 通过 SQL Server Compact 部署 ASP.NET Web 应用程序:故障排除 (12 个)

作者 :Tom Dykstra

下载初学者项目

本系列教程介绍如何使用 Visual Studio 2012 RC 或 Visual Studio Express 2012 RC for Web 部署 (发布) 包含 SQL Server Compact 数据库的 ASP.NET Web 应用程序项目。 如果安装 Web 发布更新,也可以使用 Visual Studio 2010。 有关该系列的简介,请参阅 该系列中的第一个教程

有关演示 Visual Studio 2012 RC 版本后引入的部署功能的教程,演示如何部署除 SQL Server Compact 以外的SQL Server版本,以及如何部署到 Windows Azure 网站,请参阅使用 Visual Studio ASP.NET Web 部署

本页介绍使用 Visual Studio 部署 ASP.NET 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文件中的 customErrors 元素 system.web ,请将 mode 属性更改为“off”。 否则,system.web在 属性设置为“off”的 mode 元素中添加customErrors元素,如以下示例所示:

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

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

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

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

方案

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

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

可能的原因和解决方案

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

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

方案

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

An error occurred when reading the IIS Configuration File 'MACHINE/REDIRECTION'. 
The identity performing this operation was ... Error: Cannot read configuration file due to insufficient permissions.

可能的原因和解决方案

若要在本地计算机上使用一键式发布到 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 的应用程序时,会看到以下错误消息:

The default .NET 4.0 application pool does not exist or the application could not be added. 
Please verify that ASP.NET 4.0 is installed on this machine.

可能的原因和解决方案

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 开始的规范。

方案

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

Format of the initialization string does not conform to specification starting at index 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 Error 500 - Internal Server Error.

可能的原因和解决方案

500 个错误的原因有很多,但如果遵循这些教程,则其中一个可能的原因是将 XML 元素放在其中一个 XML 转换文件中的错误位置。 例如,如果将插入<location>元素的转换置于 下而不是直接在 下<system.web><configuration>,则会出现此错误。 在这种情况下,解决方法是更正 XML 转换文件并重新部署。

HTTP 500.21 内部服务器错误

方案

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

HTTP Error 500.21 - Internal Server Error. 
Handler "PageHandlerFactory-Integrated" has a bad module "ManagedPipelineHandler" in its module list.

可能的原因和解决方案

已部署的站点目标 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: Cannot open database "DatabaseName" requested by the login. The login failed.

可能的原因和解决方案

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

无法检查模型兼容性

方案

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

Model compatibility cannot be checked because the database does not contain model metadata. 
Ensure that IncludeMetadataConvention has been added to the DbModelBuilder conventions.

可能的原因和解决方案

如果放入 Web.config 文件的数据库名称以前曾在计算机上使用过,则数据库中可能已存在一些表。 选择之前未在计算机上使用过的新名称,并将 Web.config 文件更改为指向使用此新数据库名称。 或者,可以使用 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_datareaderdb_datawriterdb_ddladmin 角色分配给它为你设置的用户帐户。 这些足以创建大多数数据库对象,但不适用于创建用户或角色。 避免此错误的一种方法是从数据库部署中排除用户和角色。 为此,可以编辑 PreSource 数据库的自动生成脚本的 元素,使其包含以下属性:

CopyAllUsers=false, CopyAllRoles=false

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

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

方案

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

可能的原因和解决方案

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

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

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

方案

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

Error: The stream data of 'sitemanifest/dbFullSql[@path='C:\TEMP\AdventureWorksGrant.sql']/sqlScript' is not yet available.

可能的原因和解决方案

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

此应用程序需要 ManagedRuntimeVersion v4.0

方案

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

错误:“sitemanifest/dbFullSql[@path='C:\TEMP\AdventureWorksGrant.sql']/sqlScript”的流数据尚不可用。 尝试使用的应用程序池的“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

方案

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

Unable to cast object of type 'Microsoft.Web.Deployment.DeploymentProviderOptions' to '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 Deploy 2.0。 必须联系托管提供商才能解决此问题。

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

方案

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

Unable to load the native components of SQL Server Compact corresponding to the ADO.NET provider of version 8482. 
Install the correct version of SQL Server Compact. Refer to KB article 974247 for more details.

可能的原因和解决方案

部署的站点没有 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 迁移配置为在首次部署后创建数据库。 运行应用程序时,会收到如下例所示的错误消息:

The path is not valid. Check the directory for the database. [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 deployment task failed. (Could not complete the request to remote agent URL 'https://serverurl.com/msdeploy.axd?site=sitename'.)
Could not complete the request to remote agent URL 'https://url/msdeploy.axd?site=sitename'.
The request was aborted: The request was canceled.
COM object that has been separated from its underlying RCW cannot be used.

可能的原因和解决方案

关闭并重启 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”的应用程序 (时,) 收到以下错误:

The 'targetFramework' attribute in the <compilation> element of the Web.config 
file is used only to target version 4.0 and later of the .NET Framework (for 
example, '<compilation targetFramework="4.0">'). The 'targetFramework' attribute 
currently references a version that is later than the installed version of the 
.NET Framework. Specify a valid target version of the .NET Framework, or install 
the required version of the .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目标