我在让 SSL 在 Development Fabric 中工作时遇到了问题。我正在使用 Visual Studio 2012 Ultimate 和 2012 年 10 月 Azure SDK for .NET 运行 Windows 8 Pro 的全新安装。没有安装 IIS8,只有 IIS Express,它声称支持 HTTPS,所以我希望这不是问题。
以管理员身份运行 VS 12,我创建了一个空白 VS 解决方案,添加了一个新的 (.NET 4.5) 云服务和一个新的 ASP.NET MVC 4 Internet Web 应用程序项目,然后按 F5。一切正常。然后,当我向 Web 角色添加 SSL 证书并将 HTTP 端点(端口 80)替换为 HTTPS 端点(端口 443,带有证书)时,按 F5 会产生以下错误消息:
适用于 Microsoft Visual Studio 的 Windows Azure 工具
将调试器附加到角色实例“deployment18(32).WindowsAzureCloudService.Mvc4WebRole_IN_0”时出错,进程 ID:4892。无法附加。访问被拒绝。
请注意,最后一部分(“访问被拒绝”)有几个变体,特别令人愉快的是“灾难性故障”。:)
VS 输出窗口(“常规”输出)中的唯一消息是:
Windows Azure 工具:警告:将角色“Mvc4WebRole”中的专用端口 443 重新映射到 444,以避免在模拟期间发生冲突。
Compute Emulator UI 没有多大帮助;就在实例消失之前,这是我始终如一地获得的唯一控制台输出(有时会出现其他消息,但偶尔会每隔几次运行一次;我不确定如何捕获这些消息):
[面料] 角色实例:deployment18(33).WindowsAzureCloudService.Mvc4WebRole.0
[面料] 角色状态未知
[面料] 角色状态暂停
[面料] 角色状态忙碌
[面料] 角色状态不健康
[面料] 角色状态已停止
该证书是从 CA 获得的,并作为具有私钥、扩展属性的 .pfx 正确导入本地机器/个人/证书存储,并标记为可导出,物有所值。
当我尝试将服务发布到 Azure 时,我收到一个关于数据库连接字符串的构建(验证)警告(我认为这无关紧要):
连接字符串“DefaultConnection”在项目“Mvc4WebRole”中使用本地数据库“(LocalDb)\v11.0”。当您在 Windows Azure 中运行此应用程序时,此连接字符串将不起作用。要访问不同的数据库,您应该更新 web.config 文件中的连接字符串。
可能更重要的是,部署实际上失败并在 Windows Azure 活动日志窗口中显示以下历史记录:
上午 9:00:25 - 警告:有包验证警告。
上午 9:00:25 - 为 WindowsAzureCloudService 准备部署 - 2013 年 1 月 3 日上午 8:59:55,订阅 ID 为“<...>”,使用服务管理 URL 'https://management.core.windows.net/ '...
上午 9:00:25 - 连接中...
9:00:26 AM - 对象引用未设置为对象的实例。
9:00:26 AM - 部署失败并出现致命错误
有人可以帮我解决这个问题吗?我已经重新启动了几次。;)
提前致谢!
编辑(1 月 3 日,下午 4:44):我有一些想法可能会帮助我取得进步,但有些想法非常激进,因此我们将不胜感激:
有没有办法将 Compute Emulator (Dev Fabric) 的所有输出捕获到日志文件中,以便我查看它?(来自我的服务的 System.Diagnostic.Trace 调用无济于事,因为使用 HTTPS 时我什至没有达到 RoleEntryPoint!)我想通了;见下一次编辑。- Azure 部署期间的空指针异常让我担心。尝试重新安装 Azure SDK 是否值得,如果是,我应该如何进行全新安装?
- 当切换到使用完整的 IIS 作为模拟器时,有没有人看到这种问题消失了?(这似乎不太可能,因为 IIS 与 IIS Express 应该与 Azure 部署无关。)
编辑(1 月 4 日,上午 10:15):坏消息:我尝试了授予对证书的读取访问权限的建议,但对我的情况没有帮助。好消息:我设法在 Compute Emulator UI 关闭之前捕获了其中一条零星消息;这是一些诊断中的一些信息。本身并没有帮助,但它揭示了 Development Fabric 存储其临时文件的位置:
[诊断] 信息:C:\Users\Lars\AppData\Local\dftmp\Resources\0005155d-4592-40f4-812e-18793b26576c\directory\DiagnosticStore\Monitor
每次部署都会重新创建 GUID 部分,并在部署消失时将其删除(在我的情况下总是如此)。但是在父目录 ('dftmp') 中,我在新部署期间监视了一些有用的目录:DevFCLogs、DFAgentLogs 和 IISConfiguratorLogs。我想这回答了我昨天的第一个问题!:)
DFAgentLogs\DFAgent.log:(41KB)没有有用的信息。一堆“读取管道失败”消息和获取角色/部署实例 ID 的失败,我认为这只是噪音。
DevFCLogs\DevFabric--2013.01.04--<...>.log: (510 KB)没有有用的信息。我浏览了文件,还搜索了“错误”、“失败”、“未找到”、“证书”和“Mvc4WebRole_IN_0”;这些都没有显示出正在发生的事情的任何迹象。
IISConfiguratorLogs\IISConfigurator.log:(6 KB)现在我们正在取得进展!:) 有人能告诉我这是什么意思吗?(与此同时,我不再寻找 ILSpy 了……好玩……)
IISConfigurator 信息:0 : [00006356:00000005, 2013/01/04 16:07:08.915] 使用 IIS Express appdomain
(...)
IISConfigurator 信息:0 : [00006356:00000005, 2013/01/04 16:07:08.936] 添加绑定 127.255.0.0:444: 到站点部署 18(40).WindowsAzureCloudService.Mvc4WebRole_IN_0_Web
IISConfigurator 信息:0 : [00006356:00000005, 2013/01/04 16:07:10.484] 捕获异常
IISConfigurator 信息:0:[00006356:00000005, 2013/01/04 16:07:10.487] 异常:System.Runtime.InteropServices.COMException (0x800401F3):无效的类字符串(来自 HRESULT 的异常:0x800401F3 (CO_E_CLASSSTRING))
服务器堆栈跟踪:
在 Microsoft.Web.Administration.Interop.IAppHostProperty.get_Value()
在 Microsoft.Web.Administration.ConfigurationElement.GetPropertyValue(IAppHostProperty 属性)
在 Microsoft.Web.Administration.Binding.get_CertificateHash()
在 Microsoft.Web.Administration.BindingCollection.Add(绑定绑定)
在 Microsoft.WindowsAzure.ServiceRuntime.IISConfigurator.WasManager.DeploySite(字符串 roleId,WASite roleSite,字符串 appPoolName,字符串 sitePath,字符串 iisLogsRootFolder,字符串 failedRequestLogsRootFolder,列表
1 bindings, List
1 协议,FileManager 文件管理器,WAAppPool defaultAppPoolSettings,字符串 roleGuid,字符串和 appPoolSid,列表`1 appPoolsAdded,字符串配置路径)
编辑(1 月 4 日,上午 11 点): ILSpy 没有多大帮助;在尝试获取证书的哈希以设置绑定(我们也知道)时,在互操作点抛出异常(我们已经知道)。有谁知道需要注册什么 COM 对象才能获得 Microsoft.Web.Administration 中绑定的证书哈希?或者我如何拦截互操作调用以找出答案?如果您能首先告诉我为什么会发生这种情况,则可以加分。:)