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)
看来实际的错误是另一回事,造成由于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引用。但显然它会增加构建时间。
尝试使用nuget的backback dll。因此,该特定版本的dll被删除。请参阅https://*.com/questions/10206090/how-to-install-an-older-version-of-package-via - 相应地改变并改变。 –