WCF常见类型不重用

And*_*Dog 16 wcf web-services visual-studio-2010 service-reference

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

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

  • 它曾经工作,但现在突然间它不再重复使用类型了
  • 添加服务引用之前引用共享程序集不起作用
  • 重启VS2010没有帮助(我有所有更新)
  • 我试过一个简单的POCO类(只是一个包含整数属性的简单类),也没有运气
  • 删除和重新添加服务引用(或共享程序集引用)没有帮助
  • 仅在"重用指定引用程序集中的类型"中选择共享程序集 - 没有运气
  • svcutil.exe /reference 产生相同的结果

不知怎的,我已经结束了.还有其他解决方案吗?

编辑:我应该补充一点,我只是将我的项目重置为早期提交,无论我使用哪个提交,仍然是同样的问题.我知道它适用于早期的提交!

Kir*_*rst 15

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

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

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

你不应该这样做,但我也会尝试过.

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

这里有一些其他的尝试

  • 打开解决方案的"Configuration Manager" - 确保将共享程序集配置为构建.
  • 确保您正在为客户端服务使用项目引用- 如果服务使用旧版本,则使用客户端上的最新程序集将无济于事.
  • 删除项目引用和构建,并期望构建失败 - 如果它没有失败,那么你必须引用其他东西.
  • 手动检查最新的"共享组件"被包含在构建两个服务端和客户端-检查bin文件夹,检查装配版本/构建日期.

如果所有其他方法都失败了,强制双方使用同一个对象的最佳方法是完全删除"服务引用"代理并使用ChannelFactory方法.请参阅简单说明如何在不添加服务引用的情况下进行呼叫WCF服务VS2010添加服务引用优于直接ClientBase <>的优势.这是我首选的WCF模式,因为它不需要"更新服务引用...",并删除所有生成的代理代码.

  • 我现在改变了我的实现,只需很少的努力就可以使用`ChannelFactory <IMyService>`.如果合同(IMyService)可以在共享程序集中,这确实是一个很好的解决方案.谢谢! (2认同)

iCo*_*ode 11

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

  1. 在我的ServiceContract中注释掉所有未返回原子类型的操作(用OperationContract属性修饰的方法).
  2. 然后在我的客户端项目中更新我的服务引用.我意识到在我的客户端项目中问题已经解决,我可以输入"[MyServiceReferenceName]".我的类型没有出现在[MyServiceReferenceName]命名空间中.我通过在XML Schema Browser中打开生成的XSD文件来确认这一点.
  3. 逐个取消注释在步骤1中注释的方法.然后每次更新您的服务引用以查看是否正在重新生成类型.
  4. 一旦找到导致服务引用无法重用类型的方法,请转到每个类,以获取输入或输出到方法的类型.检查您要序列化的所有是否都使用[DataContract]属性进行修饰.确保所有的字段属性与[数据成员]属性装饰.此外,确保使用[DataContract]修饰枚举,并使用[EnumMember]修饰每个枚举值.

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