导致 Azure 云服务(经典)角色回收的常见问题

重要

从 2024 年 9 月 1 日开始,已弃用所有客户的云服务(经典版)。 从 2024 年 10 月开始,Microsoft 将停止并关闭任何正在运行的现有部署,数据将永久性丢失。 新部署应使用基于 Azure 资源管理器的新型部署模型 Azure 云服务(外延支持)

本文讨论部署问题的一些常见原因,并提供故障排除技巧以帮助你解决这些问题。 角色实例无法启动,或者在“正在初始化”、“忙”和“正在停止”状态之间循环时,即指示应用程序存在问题。

如果本文未解决你的 Azure 问题,请访问 Microsoft Q&A 和 Stack Overflow 上的 Azure 论坛。 可以在这些论坛上发布问题。 还可提交 Azure 支持请求。 若要提交支持请求,请在 Azure 支持页上提交。

缺少运行时依赖项

如果应用程序中的某个角色依赖于某个程序集,而该程序集不是 .NET Framework 或 Azure 托管库的一部分,则必须在应用程序包中显式包括该程序集。 请记住,默认情况下,其他 Microsoft 框架在 Azure 上不可用。 如果角色依赖于此类框架,则必须将这些程序集添加到应用程序包。

在生成和打包应用程序之前,请验证是否符合以下情况:

  • 如果使用的是 Visual Studio,请确保针对项目中每个不属于 Azure SDK 或 .NET Framework 的引用程序集将“复制本地”属性设置为“True”。
  • 确保 web.config 文件不在编译元素中未引用任何未使用的程序集。
  • 每个 .cshtml 文件的“生成操作”将设置为“内容” 。 此设置可确保这些文件在包中正确显示,并使其他引用文件显示在包中。

程序集针对的平台错误

Azure 是一个 64 位的环境。 因此,为 32 位目标编译的 .NET 程序集与 Azure 不兼容。

角色在初始化或停止时引发未处理异常

任何通过 RoleEntryPoint 类的方法(包括 OnStartOnStopRun 方法)引发的异常均属未经处理的异常。 如果这些方法中的某个方法出现未经处理的异常,则角色将回收。 如果角色处于反复回收的状态,则每次该角色尝试启动时,都可能会引发未处理异常。

角色从 Run 方法返回

Run 方法会不限次数地运行。 如果代码重写了 Run 方法,该方法会无限地休眠下去。 如果 Run 方法返回,则角色会回收。

不正确的 DiagnosticsConnectionString 设置

如果应用程序使用 Azure 诊断,则服务配置文件必须指定 DiagnosticsConnectionString 配置设置。 此设置应在 Azure 中指定一个连接到存储帐户的 HTTPS 连接。

若要在将应用程序包部署到 Azure 之前确保 DiagnosticsConnectionString 设置正确无误,请验证是否符合以下情况:

  • DiagnosticsConnectionString 设置指向 Azure 中的有效存储帐户。
    默认情况下,此设置指向模拟的存储帐户中,因此必须在部署应用程序包之前显式更改此设置。 如果不更改此设置,则当角色实例尝试启动诊断监视时,将引发异常。 此事件可能导致角色实例无限期回收。
  • 连接字符串是使用以下格式指定的。 (协议必须指定为 HTTPS。)将 MyAccountName 替换为存储帐户名称,将 MyAccountKey 替换为访问密钥 :
DefaultEndpointsProtocol=https;AccountName=MyAccountName;AccountKey=MyAccountKey

如果是使用 Azure Tools for Microsoft Visual Studio 来开发应用程序,则可使用属性页面来设置此值。

导出的证书不包括私钥

若要在传输层安全性 (TLS) 下运行 Web 角色,则必须确保导出的管理证书包含私钥。 如果使用 Windows 证书管理器导出证书,请务必对“导出私钥”选项选择“是” 。 该证书必须以 .pfx 格式导出,这是当前唯一支持的格式。

后续步骤

查看更多针对云服务的 故障排除文章

Kevin Williamson 博客系列中查看更多角色回收方案。