WCF和客户端与服务之间的共享引用库

3

可以使用Visual Studio和SvcUtil生成代理代码以与服务集成。在VS 2010及之前的版本中,如果您想要维护共享类型的跨层引用库,则存在问题。这迫使采取几种解决方法来解决数据合同类型等效性问题和无法正确使用本地类型的问题。

问题的URL参考:WCF客户端代码生成 - “从引用的程序集重用类型”存在问题

我正在使用Visual Studio 2012、ASP.NET 4.5和C#代码

我的问题是:“在VS 2012中是否修复了跨程序集重用类型的问题?”我现在正在移植一些代码,但也担心这个错误可能会出现。我可以运行测试用例,但如果有人已经有答案,那会更快。我的经验是,如果您似乎找不到在线答案(搜索了并且仍然得到2011年的问题-问题仍然存在),则可能没有解决方案。

我的目标是允许未来的开发团队在企业.NET应用程序的各个层面上重用相同的类型库,包括演示(网站、移动应用程序层 - 服务器端等)、域(服务、业务逻辑层、数据访问层)等。我希望确保一些统一性和代码重用。每个层面上的代码将尽可能“松散耦合”,但通过引用程序集确保类型。同样,我希望代码能够支持第三方的外部集成。因此,我需要从DataContractAttribute装饰的类型构建所有代理类型以用于外向服务,并维护我的服务器端应用程序的引用类型。请问我会遇到任何问题吗?链接中的问题是否已解决?请给予建议。
2个回答

4

您报告的关于“从引用的程序集重用类型”选项存在的错误,是由于在使用/r标志调用svcutil.exe。

然而,svcutil.exe使用DataContractSerializer来帮助生成代码,不幸的是,当它解析您的服务合同时,它具有非常严格的规则

因此,除非您的服务XSD遵循这组规则,否则svcutil.exe将切换到使用XmlSerializer,后者不支持/r标志(或重用)。 因此,您将无法重用类型。

如果您可以引用实际的服务契约类型(通过二进制引用),那么这是一个更好的解决方案,因为您可以完全摆脱服务引用。 您还可以使用WSCF.blue生成您的服务合同,因为它具有自己的自定义序列化器,并支持类型重用。


2
要调用一个你已经有二进制引用的服务接口,你可以使用ChannelFactory,如此处所述:https://dev59.com/q1_Va4cB1Zd3GeqPR0qp#8869809。是的,WCF支持等效性,因此你可以准备一个强命名版本的服务接口程序集,并将其作为API提供给外部消费者。这取决于你的消费者是否是.NET。如果不是,你将不得不通过WSDL公开你的类型。 - tom redfern
1
关于您的评论:是的,耦合是由二进制依赖性创建的。 - tom redfern
1
@ZackJannsen 如果你使用ChannelFactory.CreateChannel(),那么你不需要在通道上调用open。 - tom redfern
1
这更加困难。我以前没有做过这个。我唯一使用过的是从svcutil预生成的客户端。 - tom redfern
顺便说一下 - 你说的其他所有内容都完美无缺。谢谢!如果我能给你更多的加号,我会的。 - Zack Jannsen
显示剩余9条评论

2
在我的情况下, WebService 和 WebApp 引用了包含领域实体的相同程序集。自然地,每个实体都被 DataContractAttribute 装饰,但在 WebApp 中使用由 WebService 公开的终结点生成 ServiceReference 时,VS2012 似乎忽略了“重用已引用程序集中的类型”选项,这导致本地程序集中出现了其他副本。然后(经过几个小时的试错),我在 WebService 的接口的 ServiceContractAttribute 中添加了一个 Namespace 参数。添加后,重新解析的 ServiceReference 开始按预期引用我的共享 DataContract 类型。
 [ServiceContract(Namespace="http://www.example.com/Demo.WebService/")]
 public interface IConfigurationService { ..methods here.. }

是的。建议显式设置命名空间。否则,您将得到默认值“http://tempuri.org/”,这就是您所遇到的问题。 - Zack Jannsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接