我有一个名为WebAccounts.dll的类库,该类库调用一些(属于我自己的)WCF Web服务。我有一个Web服务项目,它会自动构建其数据合同的客户端版本,以供其.net客户端使用。它同时构建.net 3.5和4.0版本。所以我有:
OMWebServices.dll
OMWebServices.ClientDataContracts35.dll
OMWebServices.ClientDataContracts.dll (.net 4.0 version)
作为我们正在构建的新网站的一部分,我已将WebAccounts.dll从.net 3.5升级到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,布尔值)'失败。
如果我改回到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会获得异常,以排除特定于网站项目的任何内容。
谁能解释这是怎么回事?
最佳答案
在.NET Framework v4.5中,XMLSerializer的默认实现已更改为动态代码生成。这种动态代码生成方法的主要优点是它不需要访问硬盘驱动器,这是客户要求的功能之一。但是,它的局限性在于它无法访问其他程序集中的非公开成员。这就是为什么在某些情况下会看到MethodAccessException的原因。对于不需要此动态代码生成功能的客户,仍然可以通过使用[this blog post](http://blogs.msdn.com/b/praburaj/archive/2013/12/06/xmlserializer-compat-switch.aspx)中所述的“ useLegacySerializerGeneration”配置开关来使用v4.0序列化程序。基本上,两个序列化代码路径都受支持。