我有一個名爲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從測試項目中調用時會得到異常,以排除特定於網站項目的任何內容。
任何人都可以解釋這裏發生了什麼?