WCF服务中的间歇性序列化异常查找不正确的DLL版本

问题描述:

因此,我间歇性地收到了一个Exception,它写出了我的服务器的事件日志,它记录了WCF中发生的不良事件。WCF服务中的间歇性序列化异常查找不正确的DLL版本

此异常发生在与客户端异步回调的“System.TimeoutException”同时发生。我猜想序列化问题会导致超时问题,因为调用并不是那么长。

当客户端从服务获取其异步回答时,有时会记录堆栈跟踪,包括“服务器未提供有意义的回复”。

因此,我的Web服务的“bin”文件夹包含My.Org.Core DLL的一个副本,其版本为2.0.0.0,但堆栈跟踪指的是版本1.8.0.0!我搜索了我的整个解决方案,提及这个旧的1.8.0.0,并且找不到它!请帮忙。

这里是序列化问题:

An unhandled exception occurred and the process was terminated. 

Application ID: DefaultDomain 

Process ID: xxxx 

Exception: System.Runtime.Serialization.SerializationException 

Message: Unable to find assembly 'My.Org.Core, Version=1.8.0.0, Culture=neutral, PublicKeyToken=null'. 

StackTrace: 
at System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly() 
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name) 
at System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable) 
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record) 
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run() 
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 
at System.Runtime.Remoting.Channels.CrossAppDomainSerializer.DeserializeObject(MemoryStream stm) 
at System.AppDomain.Deserialize(Byte[] blob) 
at System.AppDomain.UnmarshalObject(Byte[] blob) 
+0

尝试使用nuget的backback dll。因此,该特定版本的dll被删除。请参阅https://*.com/questions/10206090/how-to-install-an-older-version-of-package-via - 相应地改变并改变。 –

看来实际的错误是另一回事,造成由于WCF服务的一些未处理错误。

这是因为当在基于ASP.NET的应用程序中引发未处理的异常时,应用程序意外退出。出现此问题时,应用程序日志中不会记录您必须了解该问题的例外信息。

因此,要获得实际的错误,

  • 尝试增加的try-catch块代码(一些全局错误处理或为每个服务方法),并检查错误日志
  • 或检查实际的错误,按照步骤从这个article(方法1,不要从方法2的文章),并会记录实际的错误。

希望它有帮助。

1-如果在一个解决方案中有多个项目,则应打开引用旧版本DLL的每个项目文件并将其替换为新版本。

2 - 我建议你,如果你有一个分开的类库模型,并防止任何类型的序列异常,你系列化合同添加到AssemblyInfo.cs在类库是这样的:

[assembly: AssemblyProduct("blah.Data.Domain")] 

和你的合同可以是这样的:

[assembly: ContractNamespace("http://blah.xyz/test", ClrNamespace = "blah.Data.Domain" 

这个契约序列化适用于所有模型里面的类库。

正如您所提到的指向旧版dll的堆栈跟踪,您是否有机会在GAC中注册旧DLL?

所以dll版本是问题所在。

错误:My.Org.Core,版本= 1.8.0.0 coudlnt找到

预计DLL按照你的是My.Org.Core,版本= 2.0.0.0。

第一步是在您的GAC中查找该dll。

RUN然后键入%windir%\组装\ GAC_MSIL,现在潜入深海看到或搜索My.Org DLL,点击右键,如果发现检查version.If没有找到,那么你就没有这个DLL。这意味着你没有My.Org.Core,Version = 1.8.0.0 dll既不在你的bin /解决方案或GAC中。

看起来像这是你的内部组织dll.So获取1.8.0.0 th dll并将其放入bin文件夹并重新启动客户端服务。

为什么你错过了dll?可能当客户端应用程序被构建时,dll被GAC引用,因此在开发者机器中没有遇到这个问题。

如何避免这种情况?虽然应用程序构建/部署将属性副本设置为本地true,以便在构建应用程序时,将该特定的dll显式删除到包或bin文件夹中,而不需要从GAC引用。但显然它会增加构建时间。