我尝试用谷歌搜索。 Microsoft Connect 不接受服务总线的错误。 Azure 门户发送到 MS 论坛或 StackOverflow - 所以我在这里。
问题实际上就在标题中:如何报告服务总线的错误?
(不是 Azure 版本,而是您在本地安装的版本)
问题是这样的:
Microsoft.Cloud.ServiceBus.dll
引用了Microsoft.Cloud.Common.AzureStorage.dll
。它使用该程序集中的一种类型 - 即StorageAccountInfo
。它是配置部分(即NamespacePolicyDataStoreFactorySection.Parameters.BlobStorageAccountInfo
)的一部分,但显然只在 Azure 环境中有意义,并且从未在本地场景中使用。- 但有一个问题:
Microsoft.Cloud.Common.AzureStorage.dll
实际上并未随 Service Bus 1.1 一起提供。我尝试在各种 SDK 和 Azure 工具包、示例等(我有很多)以及在线中找到它,并找到了有关该 DLL 的 zippo 信息或从哪里获取它。 This这是我发现的唯一提到它的地方。 - 尽管它本身就是一个 WTF,但缺少 DLL 并不会真正阻止任何功能的工作:该类型实际上不会被本地场景中的任何代码触及,因此没有什么可提示的。
- 但这里有第二个问题:
mscorlib.dll
v4.6.7.0(随 VS2015 CTP5 一起提供)与之前的版本 4.0.30319.34014 相比略有变化,- 在中System.Attribute.InternalGetCustomAttributes(PropertyInfo,Type,bool)
,更准确地说,this line 。该行在以前版本的mscorlib
中不存在,一切都很好。但现在它确实存在,这导致属性类型被触及,从而导致加载 DLL,但失败,因为 DLL 不存在。 - 因此整个过程从加载配置部分
NamespacePolicyDataStoreFactorySection
开始,工作原理如下:
ConfigurationManager.GetSection ->
... ->
BaseConfigurationRecord.GetSectionRecursive ->
... ->
BaseConfigurationRecord.CallCreateSection ->
MgmtConfigurationRecord.CreateSection ->
ConfigurationElement.Reset ->
ConfigurationElement.get_Properties ->
ConfigurationElement.PropertiesFromType ->
ConfigurationElement.CreatePropertyBagFromType ->
Attribute.GetCustomAttribute (for property BlobStorageAccountInfo of type StorageAccountInfo) ->
... ->
Attribute.InternalGetCustomAttributes(PropertyInfo) ->
Attributes.GetIndexParameterTypes ->
RuntimePropertyInfo.GetIndexParameters ->
... ->
RuntimeMethodInfo.GetParameters ->
... ->
kaboom! (touches the return type, tries to load DLL containing it, fails)
一些(徒劳的)尝试解决方法
- 从 config 中删除配置部分。不幸的是,服务总线在这方面的容错能力不是很好:当节不存在时,NRE 会失败。也不可能提供替代的配置部分“handler”,因为在.NET配置系统中“handler”和“data”是同一件事。
- 提供具有所需类型的假 DLL。不能这样做,因为一切都是强命名的。
- 在某处找到丢失的 DLL。尝试过但失败了。网络上没有提及该 DLL,更不用说这些位了。
细心的读者可能会问:哇,等一下! VS2015 CTP5?!您是说您在工作机器上安装了预发布软件吗?!那么,当然不行,你还指望什么呢?这将教您成为早期采用者!
细心的读者绝对是正确的:完全是我的错,我知道潜在的危险,无论如何我还是这么做了,这是我的错。
但这不是重点。我安装预发布软件并没有减少引用 DLL 的麻烦,但又不传送它。虽然我个人不会有什么问题,但我只是想确保当 .NET 5 发布并进入 Windows 更新时,它不会突然停止工作。
最佳答案
我知道这是一个迟到的问题答案,实际上并不是所问问题的答案,但是今天,在装有 Windows Service Bus 1.1 的 PC 上安装 VS 2015 RC 并重新启动 PC 后,我的服务总线网关服务停止工作,我经历了这个问题中描述的所有痛苦,但最终可以从假装配场景中找到解决方案。解决办法如下:
- 创建了版本 2.1.0.0 的伪造程序集 Microsoft.Cloud.Common.AzureStorage.dll,并使用新的 key 文件对其进行了签名。
- 使用以下方法对其进行反汇编:ildasm/all/out=azurestorage.il Microsoft.Cloud.Common.AzureStorage.dll
- 通过 ildasm/Tp Microsoft.Cloud.Common.Diagnostics.dll 从位于服务总线文件夹中的另一个 Microsoft.Cloud.* 程序集中提取了公钥和公钥 token
- 在文本编辑器中打开 azurestorage.il,并使用上一步中提取的公钥更改公钥 token 和公钥
- 重新组装 il 文件:ilasm/dll azurestorage.il/out=Microsoft.Cloud.Common.AzureStorage.dll
- 使用以下方式注册程序集以跳过签名验证:sn -Vr Microsoft.Cloud.Common.AzureStorage.dll
- 将生成的程序集安装到 GAC:gacutil/i Microsoft.Cloud.Common.AzureStorage.dll
终于成功了。希望这对陷入此问题的任何人有所帮助。
关于azure - 如何报告 Windows Server 服务总线中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28333034/