可能导致此错误的一件事是运行 Web 角色本身,而不是运行包含的云项目。如果这是问题所在,您可以通过确保将云项目设置为调试的启动项目而不是 Web 角色来解决它。
运行自行定义 Web 角色的 ASP.NET 项目是可能的,有时也很有用。这比在 Azure Compute Emulator 中运行要快得多。它还可以使您无需运行 VS 提升即可开发您的项目。另外,我发现模拟器往往会导致Visual Studio时不时报出无效的内存访问错误,此时需要重启VS。直接运行 Web 角色可以避免所有这些问题。
但是,有一些事情可以阻止这个工作,你描述的异常是这些问题之一的症状。如果您的 Web 角色Web.config
包含 Azure 的配置DiagnosticMonitorTraceListener
(并且 Visual Studio 在您创建 Web 角色时默认添加该配置),那么如果您在模拟器之外运行,则尝试生成跟踪输出的第一件事将因您描述的错误而崩溃。碰巧的是,从中检索设置CloudConfigurationManager
似乎可以做到这一点。
顺便说一句,这不是特有的CloudConfigurationManager
。它所做的只是产生一些跟踪输出。VS 将 Web 角色配置为将所有跟踪输出发送到 Azure 诊断侦听器,并且由于该侦听器只能在计算模拟器或实际 Azure 实例中运行,因此尝试生成跟踪输出的第一件事将崩溃。CloudConfigurationManager
是一个常见的候选,因为它恰好产生跟踪输出,并且通常在角色启动时早期使用。但原则上,任何产生跟踪输出的东西都可能遇到这个异常。
避免这种情况的一种简单方法是从配置文件中删除相关部分。创建新的 Web 角色时,Visual Studio 会添加一个<system.diagnostics>
部分,用于配置默认跟踪输出以转到 Azure 诊断侦听器。你可以把它注释掉。这将使您能够直接在 Visual Studio 中调试 Web 角色,而无需使用计算模拟器(假设您没有做任何其他取决于处于角色环境中的事情)。
当然,这样做的问题是在 Azure 中运行时您将不再获得任何诊断跟踪。解决这个问题的一种方法是将相关配置移动到Web.config.Release
文件中(添加必要的xdt:
属性)。
当您使用本地计算模拟器时,此更改还将停止运行 Azure 诊断跟踪侦听器。(这不是问题,因为跟踪消息仍会出现在调试器中。这只是意味着您不会像实际运行时那样将跟踪的持久副本复制到表存储中。)解决此问题的明显方法似乎要对Web.config.Debug
(或在模拟器中运行发布版本)进行类似的修改,但有一个障碍:默认情况下,云项目在为模拟器打包时不应用配置文件转换。幸运的是,您可以解决此问题:http: //blog.hill-it.be/2011/03/07/no-web-config-transformation-in-local-azure/展示了如何在计算模拟器中启用转换以进行本地调试。(顺便说一句,直接从 VS 中调试 ASP.NET 项目时,从不应用转换。)