WCF通用类型未重用

WCF通用类型未重用,wcf,web-services,visual-studio-2010,service-reference,Wcf,Web Services,Visual Studio 2010,Service Reference,提示:这个问题有很多重复,但没有一个解决方案适合我 我拥有的是一个web服务和一个客户端,两者都有对共享程序集“DataModel”的引用。我正在使用“添加服务引用…”对话框创建服务代理,并选择“在所有引用的程序集中重用类型”,但它仍然会创建新类型,而不是重用我的类型 它过去可以工作,但现在突然不再重用类型了 在添加服务引用之前引用共享程序集不起作用 重新启动VS2010没有帮助(我有所有更新) 我尝试了一个简单的POCO类(只是一个包含整数属性的简单类),但也没有成功 删除并重新添加服务引用

提示:这个问题有很多重复,但没有一个解决方案适合我

我拥有的是一个web服务和一个客户端,两者都有对共享程序集“DataModel”的引用。我正在使用“添加服务引用…”对话框创建服务代理,并选择“在所有引用的程序集中重用类型”,但它仍然会创建新类型,而不是重用我的类型

  • 它过去可以工作,但现在突然不再重用类型了
  • 在添加服务引用之前引用共享程序集不起作用
  • 重新启动VS2010没有帮助(我有所有更新)
  • 我尝试了一个简单的POCO类(只是一个包含整数属性的简单类),但也没有成功
  • 删除并重新添加服务引用(或共享程序集引用)没有帮助
  • 仅在“在指定的引用程序集中重用类型”中选择共享程序集-不成功
  • svcutil.exe/reference
    产生相同的结果
不知怎的,我已经不知所措了。还有其他解决办法吗


编辑:我应该补充一点,我只是将我的项目重置为较早的提交,无论我使用哪个提交,仍然存在相同的问题。我知道它和以前的提交一起工作

这有点遥不可及,但有一种可能性是GAC中有一个旧版本的共享dll

它尝试使用共享dll,查找缺少类型的dll,然后恢复到创建类型

在添加服务引用之前引用共享程序集不起作用

您需要这样做,或者至少在添加引用后更新服务引用

删除并重新添加服务引用(或共享程序集引用)没有帮助

你不应该这么做,但我也会尝试的

为了使“重用”工作,两个项目(客户机和服务)都需要使用相同版本的程序集。您正在引用项目,这很好-我以前在直接引用程序集时遇到过这种情况,因为版本不同

这里有一些其他的东西可以尝试

  • 打开解决方案的“配置管理器”-确保已将共享程序集配置为生成
  • 确保您正在为客户端和服务使用项目引用-如果服务使用的是旧版本,则在客户端上使用最新的程序集不会有帮助
  • 删除项目引用和构建,并期望构建失败-如果它没有失败,那么您必须引用其他内容
  • 手动检查最新的“共享程序集”是否包含在服务和客户端的生成中-检查
    bin
    文件夹,检查程序集版本/生成日期
如果所有其他方法都失败了,那么在两侧强制相同对象的最佳方法是完全删除“服务引用”代理并使用ChannelFactory方法。见和。这是我首选的WCF模式,因为它消除了“更新服务引用…”的需要,并删除了所有生成的代理代码。

ObjectException

我们最近在我工作的地方遇到了同样的问题。我们花了四个小时才找到问题所在,但我们最终发现,与拒绝复制的对象位于同一dll中的对象上的枚举与服务中使用的另一个枚举同名,因此它拒绝重用该dll中的任何类型

建议(解决方案?): 确保DLL中没有其他对象,或这些对象上没有对象,或。。。等
与您服务中的名称相同。

我花了整整一天的时间试图找出为什么在VS2013中添加服务引用时,共享dll中的类型没有被重用。事实证明,该服务存在几个与序列化相关的问题。我有几个枚举没有EnumMember属性。我解决问题的方法是尝试以下步骤:

  • 注释掉我的ServiceContract中未返回原子类型的所有操作(使用OperationContract属性修饰的方法)
  • 然后在我的客户项目中更新我的服务参考。在我的客户机项目中,当我能够键入“[MyServiceReferenceName]”并且我的类型没有出现在[MyServiceReferenceName]命名空间中时,我意识到问题已经解决了。我通过在XMLSchema浏览器中打开生成的XSD文件来确认这一点
  • 一个接一个地,取消注释步骤1中注释的方法。然后,每次更新您的服务参考,查看是否恢复这些类型
  • 找到导致服务引用无法重用类型的方法后,请转到每个类,查找该方法的输入或输出类型。检查要序列化的所有类是否都用[DataContract]属性修饰。确保所有字段和属性都用[DataMember]属性修饰。另外,确保枚举用[DataContract]修饰,并且每个枚举值都用[EnumMember]修饰。

  • 我希望这能帮助其他正在经历这个令人沮丧的过程的人,这个问题不一定与共享dll有关。我的问题实际上不是使用添加或更新服务引用的问题。问题在于我的实体(模型)类没有使用适当的属性进行修饰,以通知DataContractSerializer序列化这些类型。似乎如果序列化的任何部分失败,添加服务引用会添加所有类型。

    这是一个老话题,但由于我今天遇到了相同的问题,我想分享我的修复方案

    对我来说,问题是在两个项目(服务和客户机)中都正确添加了共享程序集,但都是在ser上添加的
    SvcUtil.exe /t:code /language:cs  /r:<path of the .dll that contains the types to reuse on client side> <wcf service url>
    
    public class FooMetadata : Dictionary<Guid, FooMetadataType>
    {
    }