【发布时间】:2012-08-11 05:01:15
【问题描述】:
对于我们即将发布的版本,我们已从 NServiceBus 3.0.3 升级到 3.2.7。我们在本地或 QA 测试期间没有遇到任何问题,但是在暂存环境中进行测试时,我们无法启动引用 NServiceBus 的 IIS 托管的 Web 服务。
登台机器使用与 QA 相同的软件; Windows 2008R2、IIS7.5
事件日志有两个错误。首先是事件 1026(.NET 运行时)
应用程序:w3wp.exe 框架版本:v4.0.30319 描述: 由于未处理的异常,进程被终止。异常信息: NServiceBus.Unicast.Queuing.FailedToSendMessageException 堆栈:在 NServiceBus.Unicast.Queuing.Msmq.MsmqMessageSender.NServiceBus.Unicast.Queuing.ISendMessages.Send(NServiceBus.Unicast.Transport.TransportMessage, NServiceBus.Address)在 NServiceBus.Unicast.UnicastBus.SendSubscribeMessageWithRetries(NServiceBus.Address, NServiceBus.Unicast.Transport.TransportMessage,System.String,Int32) 在 NServiceBus.Unicast.UnicastBus+c_DisplayClass8.b_7(System.Object) 在 System.Threading.ExecutionContext.runTryCode(System.Object) 在 System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode,System.Object)在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback,System.Object,布尔值)在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 在 System.Threading.ThreadPoolWorkQueue.Dispatch() 在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
随后是事件 1326 (ASP.NET 4.0.30319.0)
发生未处理的异常,进程终止。
应用程序 ID:默认域
进程 ID:10180
异常:System.Runtime.Serialization.SerializationException
消息:无法找到程序集 'NServiceBus.Core,版本 = 3.2.0.0, 文化=中性,PublicKeyToken=9fc386479f8a226c'。
堆栈跟踪:在 System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly() 在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo 装配信息,字符串名称)在 System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(字符串 objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable) 在 System.Runtime.Serialization.Formatters.Binary._BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped 记录)在 System.Runtime.Serialization.Formatters.Binary._BinaryParser.Run()
在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler 处理程序,__BinaryParser serParser,布尔 fCheck,布尔 isCrossAppDomain, IMethodCallMessage methodCallMessage) 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流 serializationStream, HeaderHandler 处理程序, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 在 System.AppDomain.Deserialize(Byte[] blob) 在 System.AppDomain.UnmarshalObject(Byte[] blob)
我检查了 bin 文件夹,它们确实包含正确版本的 NServiceBus.dll 和 NServiceBus.Core.dll(并且两者都是相同的版本,3.2.7)。
我感到很困惑,我想我已经检查了明显的事情。会不会是它正在尝试加载多个版本的 NServiceBus(即一些未更新的参考?)。但是,这应该是 QA 中已经存在的问题了?
【问题讨论】:
-
异常说“3.2.0.0”而你说“3.2.7”。您是否尝试设置程序集重新绑定,以便使用 3.2.7 解决对 3.2.0.0 的任何引用?
-
@WiktorZychla:我相信 Nservicebus 使用了一个版本控制方案,这样 3.2.* 必须相互兼容,因此在其二进制文件中仅使用 0 标记其余位置,semver.org。我们从 NuGet 获得的二进制文件在 nuget 中标记为 3.2.7,但在 Windows 中检查它们会显示版本 3.2.0.0
-
好的。另一个线索是捕获 appdomain 的 AssemblyResolve。如果他们的新版本依赖于另一个未找到的程序集,那么序列化程序可能会出现问题,但您看不到真正的原因。然后,Assemblyresolve 将触发以尝试加载丢失的程序集。还要检查内部异常。
-
您找到答案了吗?刚刚通过 Nuget 从 3.2.8 更新到 3.3.3,现在 IIS 抱怨 {"Could not load file or assembly 'NServiceBus, Version=3.2.0.0, Culture=neutral, PublicKeyToken=9fc386479f8a226c' 或其依赖项之一。位于程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)":"NServiceBus, Version=3.2.0.0, Culture=neutral, PublicKeyToken=9fc386479f8a226c"}
-
@mellodev:我记得,这是由于有人在 WCF 应用程序中添加了对 NServiceBus.Host 的引用,你检查过吗?不过已经有一段时间了,所以我可能会混淆这些愚蠢的错误……如果不是这样,我可以在两周后回去工作时看看。
标签: c# asp.net nservicebus