Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF服务中的间歇性序列化异常查找不正确的DLL版本_C#_.net_Windows_Wcf_Iis - Fatal编程技术网

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

C# WCF服务中的间歇性序列化异常查找不正确的DLL版本,c#,.net,windows,wcf,iis,C#,.net,Windows,Wcf,Iis,因此,我会间歇性地从WCF中发生的错误中得到一个写入服务器事件日志的异常 此异常与客户端异步回调的“System.TimeoutException”同时发生。我想序列化问题会导致超时问题,因为调用并不那么长 客户端有时会记录stacktrace,包括从服务返回异步应答时“服务器未提供有意义的应答” 因此,我的web服务的“bin”文件夹包含版本为2.0.0.0的my.Org.Core DLL的副本,但是stacktrace指的是版本1.8.0.0!我搜索了我的整个解决方案,以查找任何关于旧1.8

因此,我会间歇性地从WCF中发生的错误中得到一个写入服务器事件日志的异常

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

客户端有时会记录stacktrace,包括从服务返回异步应答时“服务器未提供有意义的应答”

因此,我的web服务的“bin”文件夹包含版本为2.0.0.0的my.Org.Core DLL的副本,但是stacktrace指的是版本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块添加到代码中(一些全局错误处理或每个服务方法),并检查错误日志
  • 或者,要检查实际错误,请按照本文中的步骤(方法1,不要使用本文中的方法2)并记录实际错误

希望对您有所帮助。

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

2-我建议您,如果您在单独的类库中有模型,并且为了防止任何类型的序列化异常,请将您的序列化契约添加到该类库中的
AssemblyInfo.cs
,如下所示:

[assembly: AssemblyProduct("blah.Data.Domain")]
[assembly: ContractNamespace("http://blah.xyz/test",  ClrNamespace = "blah.Data.Domain"
你的合同可以是这样的:

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

此契约序列化适用于类库内的所有模型。

正如您提到的stacktrace引用旧版本的dll,您是否有可能在GAC中注册旧dll

所以dll版本是个问题

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

您期望的dll是My.Org.Core,版本=2.0.0.0

第一步是在GAC中查找该dll

运行然后键入%windir%\assembly\gacmsil,现在深入查看或搜索My.Org dll,右键单击,如果找到,则检查版本。如果未找到,则您没有dll。这意味着您的bin/解决方案或GAC中都没有My.Org.Core,version=1.8.0.0 dll

看起来这是您的内部组织dll。因此,获取第1.8.0.0个dll并将其放入您的bin文件夹中,然后重新启动客户端服务

为什么缺少dll?可能在构建客户端应用程序时,dll是从GAC引用的,因此在开发人员机器中没有遇到这个问题


如何避免这种情况?当应用程序生成/部署时,请将属性副本设置为local true,以便在应用程序生成时,该特定dll被显式地放在包或bin文件夹中,无需从GAC中引用。但显然,这会增加构建时间。

尝试使用nuget对dll进行回滚。以便删除特定版本的dll。请参考此内容并相应地进行更改。