作者:Tom Dykstra
本教程系列介绍如何使用 Visual Studio 2012 或 Visual Studio 2010 将 ASP.NET Web 应用程序部署到 Azure 应用服务 Web 应用或第三方托管提供程序。 有关该系列的信息,请参阅 该系列中的第一个教程。
本页介绍使用 Visual Studio 部署 ASP.NET Web 应用程序时可能出现的一些常见问题。 对于每个原因,提供了一个或多个可能的原因和相应的解决方案。
所示的方案适用于 Azure 和第三方托管提供程序。 有关对 Azure 应用服务中的 Web 应用进行故障排除的详细信息,请参阅以下资源:
- 使用 Visual Studio 对 Azure 应用服务中的 Web 应用进行故障排除
- 在 Azure 应用服务中监视 Web 应用
- 宣布发布适用于 .NET 的 Windows Azure SDK 2.0 (ScottGu 的博客显示如何在 Visual Studio 中获取诊断日志)
“/” 应用程序中的服务器错误 - 当前自定义错误设置阻止远程查看错误的详细信息
情景
将站点部署到远程主机后,你会收到一条错误消息,该错误消息提到 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 模式,重新部署应用程序,然后再次运行应用程序:
如果应用程序 Web.config 文件在 system.web 元素中具有 customErrors 元素,请将 mode 属性更改为“off”。 否则,在 system.web 元素中添加一个 customErrors 元素,模式属性设置为“off”,如以下示例所示:
<configuration> <system.web> <customErrors mode="off"/> </system.web> </configuration>部署应用程序。
运行应用程序并重复之前所做的导致错误发生的任何操作。 现在,可以看到实际错误消息是什么。
解决错误后,还原原始 customErrors 设置并重新部署应用程序。
无法创建/影子拷贝“ContosoUniversity”,因为该文件已存在。
情景
尝试在 Visual Studio 中运行项目时,会收到一个错误消息页,如以下示例所示:
“/”应用程序中的服务器错误。 当该文件已存在时,无法创建或快照复制“ContosoUniversity”。
可能的原因和解决方案
等待一分钟并刷新浏览器,或重新编译站点,然后再次尝试运行它。
使用 SQL Server Compact 的网页访问被拒绝
情景
部署使用 SQL Server Compact 的站点并在访问数据库的已部署站点中运行页面时,会看到以下错误消息:
访问被拒绝。 (HRESULT 异常:0x80070005(E_ACCESSDENIED))
可能的原因和解决方案
服务器上的 NETWORK SERVICE 帐户需要能够读取 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 转换文件之一中的错误位置。 例如,如果将插入<location>元素的转换放在<system.web>下,而不是直接放在<configuration>下,就会出现此错误。 可以使用 Web.config 转换预览功能来验证转换是否按预期工作。 如果发现转换编码错误,可以更正转换文件并重新部署。 如果错误不明显,请尝试注释掉相关的转换操作并重新部署,以查找哪个导致了 500 错误。
HTTP 500.21 内部服务器错误
情景
运行部署的站点时,会看到以下错误消息:
HTTP 错误 500.21 - 内部服务器错误。 处理程序“PageHandlerFactory-Integrated”在其模块列表中包含“ManagedPipelineHandler”这一坏模块。
可能的原因和解决方案
您部署的网站目标是 ASP.NET 4,但服务器上的 IIS 中未注册 ASP.NET 4。 在服务器上打开具有管理员权限的命令提示符,并通过运行以下命令注册 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文件,.mdf文件的名称也不能与计算机上存在的任何 SQL Server Express 数据库的名称匹配。 将 .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 元素的信息,请参阅 How to: Edit Deployment Settings in the Project File. 如果开发数据库中的用户或角色需要位于目标数据库中,请联系托管提供程序以获取帮助。
部署期间运行自定义脚本时的 SQL Server 超时错误
情景
你已指定在部署期间要运行的自定义 SQL 脚本,但它们在由 Web Deploy 执行时超时。
可能的原因和解决方案
运行具有不同事务模式的多个脚本可能会导致超时错误。 默认情况下,自动生成的脚本在事务中运行,但自定义脚本不会运行。 如果在
如果已配置事务设置,以便所有事务设置相同,但仍收到此错误,则可能的解决方法是单独运行脚本。 在“包/发布 SQL”选项卡的数据库脚本网格中,清除导致超时错误的脚本的“包含”复选框,然后发布项目。 然后返回到 “数据库脚本 ”网格,选中该脚本的 “包含 ”复选框,然后清除其他脚本的 “包含 ”复选框。 然后再次发布项目。 这一次发布时,仅运行所选自定义脚本。
站点清单的流数据尚不可用
情景
使用带有 t (test) 选项 的 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 部署 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。
可能的原因和解决方案
部署的站点在应用程序的 bin 文件夹下没有包含本机程序集的 amd64 和 x86 子文件夹。 在安装了 SQL Server Compact 的计算机上,本机程序集位于 C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private 中。 将正确的文件获取到 Visual Studio 项目中的正确文件夹中的最佳方式是安装 NuGet SqlServerCompact 包。 包安装添加了生成后脚本,用于将本机程序集复制到 amd64 和 x86。 但是,若要部署这些内容,必须手动将其包含在项目中。 有关详细信息,请参阅 “部署 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文件夹中设置写入权限。 如果您知道网站文件夹的默认权限是正确的,并且不需要进行设置,可以通过在发布配置文件(影响单个配置文件)或 wpp.targets 文件(影响所有配置文件)中添加 <IncludeSetACLProviderOnDestination>False</IncludeSetACLProviderOnDestination> 来禁用此行为。 有关如何编辑这些文件的信息,请参阅 如何:在配置文件(.pubxml)文件中编辑部署设置。
当应用程序试图写入应用程序文件夹时出现访问被拒绝错误
情景
应用程序尝试在某个应用程序文件夹中创建或编辑文件时出错,因为它没有该文件夹的写入权限。
可能的原因和解决方案
默认情况下,Visual Studio 对网站的根文件夹设置读取权限,并在App_Data文件夹中设置写入权限。 如果应用程序需要对子文件夹的写入访问权限,可以设置该文件夹的权限,如本系列的“设置文件夹权限”和“部署到生产环境”教程中所示。 如果您的应用程序需要对站点的根文件夹进行写入访问权限,您必须通过在发布配置文件中添加 <IncludeSetACLProviderOnDestination>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 的以下行作为错误的原因:
<编译 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。