azure - 如何报告 Windows Server 服务总线中的错误?

标签 azure .net-core azureservicebus servicebus mscorlib

我尝试用谷歌搜索。 Microsoft Connect 不接受服务总线的错误。 Azure 门户发送到 MS 论坛或 StackOverflow - 所以我在这里。

问题实际上就在标题中:如何报告服务总线的错误?
(不是 Azure 版本,而是您在本地安装的版本)

问题是这样的:

  1. Microsoft.Cloud.ServiceBus.dll 引用了 Microsoft.Cloud.Common.AzureStorage.dll。它使用该程序集中的一种类型 - 即 StorageAccountInfo。它是配置部分(即 NamespacePolicyDataStoreFactorySection.Parameters.BlobStorageAccountInfo)的一部分,但显然只在 Azure 环境中有意义,并且从未在本地场景中使用。
  2. 但有一个问题:Microsoft.Cloud.Common.AzureStorage.dll 实际上并未随 Service Bus 1.1 一起提供。我尝试在各种 SDK 和 Azure 工具包、示例等(我有很多)以及在线中找到它,并找到了有关该 DLL 的 zippo 信息或从哪里获取它。 This这是我发现的唯一提到它的地方。
  3. 尽管它本身就是一个 WTF,但缺少 DLL 并不会真正阻止任何功能的工作:该类型实际上不会被本地场景中的任何代码触及,因此没有什么可提示的。
  4. 但这里有第二个问题:mscorlib.dll v4.6.7.0(随 VS2015 CTP5 一起提供)与之前的版本 4.0.30319.34014 相比略有变化,- 在 中System.Attribute.InternalGetCustomAttributes(PropertyInfo,Type,bool),更准确地说,this line 。该行在以前版本的 mscorlib 中不存在,一切都很好。但现在它确实存在,这导致属性类型被触及,从而导致加载 DLL,但失败,因为 DLL 不存在。
  5. 因此整个过程从加载配置部分 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)

一些(徒劳的)尝试解决方法

  1. 从 config 中删除配置部分。不幸的是,服务总线在这方面的容错能力不是很好:当节不存在时,NRE 会失败。也不可能提供替代的配置部分“handler”,因为在.NET配置系统中“handler”和“data”是同一件事。
  2. 提供具有所需类型的假 DLL。不能这样做,因为一切都是强命名的。
  3. 在某处找到丢失的 DLL。尝试过但失败了。网络上没有提及该 DLL,更不用说这些位了。

细心的读者可能会问:哇,等一下! VS2015 CTP5?!您是说您在工作机器上安装了预发布软件吗?!那么,当然不行,你还指望什么呢?这将教您成为早期采用者!
细心的读者绝对是正确的:完全是我的错,我知道潜在的危险,无论如何我还是这么做了,这是我的错。

但这不是重点。我安装预发布软件并没有减少引用 DLL 的麻烦,但又不传送它。虽然我个人不会有什么问题,但我只是想确保当 .NET 5 发布并进入 Windows 更新时,它不会突然停止工作。

最佳答案

我知道这是一个迟到的问题答案,实际上并不是所问问题的答案,但是今天,在装有 Windows Service Bus 1.1 的 PC 上安装 VS 2015 RC 并重新启动 PC 后,我的服务总线网关服务停止工作,我经历了这个问题中描述的所有痛苦,但最终可以从假装配场景中找到解决方案。解决办法如下:

  1. 创建了版本 2.1.0.0 的伪造程序集 Microsoft.Cloud.Common.AzureStorage.dll,并使用新的 key 文件对其进行了签名。
  2. 使用以下方法对其进行反汇编:ildasm/all/out=azurestorage.il Microsoft.Cloud.Common.AzureStorage.dll
  3. 通过 ildasm/Tp Microsoft.Cloud.Common.Diagnostics.dll 从位于服务总线文件夹中的另一个 Microsoft.Cloud.* 程序集中提取了公钥和公钥 token
  4. 在文本编辑器中打开 azurestorage.il,并使用上一步中提取的公钥更改公钥 token 和公钥
  5. 重新组装 il 文件:ilasm/dll azurestorage.il/out=Microsoft.Cloud.Common.AzureStorage.dll
  6. 使用以下方式注册程序集以跳过签名验证:sn -Vr Microsoft.Cloud.Common.AzureStorage.dll
  7. 将生成的程序集安装到 GAC:gacutil/i Microsoft.Cloud.Common.AzureStorage.dll

终于成功了。希望这对陷入此问题的任何人有所帮助。

关于azure - 如何报告 Windows Server 服务总线中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28333034/

相关文章:

Azure Bicep - 无法设置 ipSecurityRestrictions

c# - 无法在 C# 代码中将 Azure 云存储帐户的公共(public)文件 URL 过期时间设置为超过 1 年

Azure ServiceBus 单元测试

azure - 使用 Azure ServiceBus 队列配置 WSO2 4.8.1

c# - 在代码迁移中如何使用LINQ将一张表中的数据插入到其自身上?

c# - 在 azure dev Fabric 上运行的 silverlight 中不会命中断点

c# - .NET Core 中 AppDomain.GetLoadedAssemblies() 的替代品?

azure - 使用队列订阅 Azure 服务总线主题

javascript - Windows Azure 和 JavaScript 多个Where子句

xml - ASP.NET Core 的 XML 配置提供程序中的数组