2017-10-11 52 views
0

因此,我間歇性地收到了一個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://stackoverflow.com/questions/10206090/how-to-install-an-older-version-of-package-via - 相應地改變並改變。 –

回答

0

看來實際的錯誤是另一回事,造成由於WCF服務的一些未處理錯誤。

這是因爲當在基於ASP.NET的應用程序中引發未處理的異常時,應用程序意外退出。出現此問題時,應用程序日誌中不會記錄您必須瞭解該問題的例外信息。

因此,要獲得實際的錯誤,

  • 嘗試增加的try-catch塊代碼(一些全局錯誤處理或爲每個服務方法),並檢查錯誤日誌
  • 或檢查實際的錯誤,按照步驟從這個article(方法1,不要從方法2的文章),並會記錄實際的錯誤。

希望它有幫助。

0

1-如果在一個解決方案中有多個項目,則應打開引用舊版本DLL的每個項目文件並將其替換爲新版本。

2 - 我建議你,如果你有一個分開的類庫模型,並防止任何類型的序列異常,你係列化合同添加到AssemblyInfo.cs在類庫是這樣的:

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

和你的合同可以是這樣的:

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

這個契約序列化適用於所有模型裏面的類庫。

0

正如您所提到的指向舊版dll的堆棧跟蹤,您是否有機會在GAC中註冊舊DLL?

0

所以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引用。但顯然它會增加構建時間。