2015-05-28 28 views
4

我有一個名爲WebAccounts.dll的類庫調用了一些(我自己的)WCF Web服務。我有Web服務項目自動建立其數據合約的客戶端版本供其.net客戶端使用。它構建了一個.net 3.5和4.0版本。所以,我有:爲什麼客戶端DataContracts的.Net 4.0版本在.NET 4.5應用程序中導致MethodAccessException?

OMWebServices.dll 
OMWebServices.ClientDataContracts35.dll 
OMWebServices.ClientDataContracts.dll (.net 4.0 version) 

作爲一個新的網站,我們正在建設的一部分,我從.NET 3.5升級WebAccounts.dll至4.5。所以我也更新了它的ClientDataContracts參考從3.5版本到4.0版本,因爲它現在可以使用它。

現在,當WebAccounts試圖調用服務的方法,我得到一個MethodAccessException:

嘗試通過方法 'WebAccounts.Data.Franchise..ctor(System.String, IdentifierType)' 訪問方法「 WebAccounts.OMConfigService.ConfigurationServiceClient.GetFranchise(System.String, OMWebServices.DataContracts.FranchiseIDType,Boolean)'失敗。

如果我更改回ClientDataContracts35,它會成功運行。令人困惑的是,更改我的數據約定程序集版本會影響我的代碼是否可以訪問生成的代理方法(該方法不在ClientDataContacts程序集中並且是公共的)。

我已經偶然發現了this Question,其中說您可以將<xmlSerializer useLegacySerializerGeneration="true"/>添加到web.config以修復某些.net 4.5序列化兼容性問題。我給它一個鏡頭,它使用4.0 ClientDataContracts修復它。但爲什麼?

最後一個轉折是,如果我跳過我的網站項目中使用WebAccounts,只是添加一個服務引用,並調用相同的服務直接,它的作品甚至與4.0 ClientDataContracts而無需添加useLegacySerializerGeneration配置。因此,使用ClientDataContracts(4.0),網站可以直接調用Web服務,但調用調用同一Web服務的WebAccounts會得到異常。我也驗證了WebAccounts從測試項目中調用時會得到異常,以排除特定於網站項目的任何內容。

任何人都可以解釋這裏發生了什麼?

回答

0

在.NET Framework v4.5中,XMLSerializer的默認實現已更改爲動態代碼生成。這種動態代碼生成方法的主要優點是不需要訪問硬盤驅動器,這是客戶要求的功能之一。但是,它的侷限性是它無法訪問其他程序集中的非公開成員。這就是爲什麼你在某些情況下看到MethodAccessException。對於不需要此動態代碼生成功能的客戶,仍然可以使用[本文博客](http://blogs.msdn.com/b/praburaj/archive/2013/12/06/xmlserializer-compat-switch.aspx)中記錄的「useLegacySerializerGeneration」配置開關使用v4.0序列化程序。基本上,這兩個序列化代碼路徑都受支持。

相關問題