为什么.net 4.0构建的客户端数据合约会在.net 4.5应用程序中导致MethodAccessException
本文关键字:net 应用程序 MethodAccessException 构建 客户端 为什么 数据 约会 | 更新日期: 2023-09-27 17:51:00
我有一个名为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. tor(System.String),WebAccounts.OMConfigService.ConfigurationServiceClient.GetFranchise(System.String,OMWebServices.DataContracts。
如果我改回ClientDataContracts35,它工作成功。令人困惑的是,更改我的数据契约程序集版本会影响我的代码是否可以访问生成的代理方法(该方法不在clientdataccontacts程序集中,并且是公共的)。
我偶然发现了这个问题,它说你可以将<xmlSerializer useLegacySerializerGeneration="true"/>
添加到web。配置来修复一些。net 4.5序列化兼容性问题。我给了它一个镜头,它修复它时使用4.0 ClientDataContracts。但是为什么呢?
最后一个转折是,如果我跳过在我的网站项目中使用WebAccounts,只是添加一个服务引用并直接调用相同的服务,它甚至可以与4.0 ClientDataContracts一起工作,而不需要添加useLegacySerializerGeneration配置。所以使用ClientDataContracts(4.0),网站可以直接调用web服务,但是调用调用相同web服务的WebAccounts会得到异常。我还验证了WebAccounts在从测试项目调用时获得异常,以排除任何特定于网站项目的内容。
谁能解释一下这是怎么回事?在。net Framework v4.5中,XMLSerializer的默认实现已更改为动态代码生成。这种动态代码生成方法的主要优点是它不需要访问硬盘驱动器,这是客户要求的特性之一。但是,它的限制是不能访问来自其他程序集的非公共成员。这就是为什么在某些情况下会看到methodaccessception。对于不需要这种动态代码生成功能的客户,仍然可以使用v4.0序列化器,通过使用"useLegacySerializerGeneration"配置开关,如[本博客文章](http://blogs.msdn.com/b/praburaj/archive/2013/12/06/xmlserializer-compat-switch.aspx)所述。基本上,支持两种序列化代码路径。