WCF单点联系人

时间:2011-09-04 15:56:19

标签: c# .net wcf

WCF初学者的问题:我被告知更改WCF合同的成本很高,需要不断维护(在客户端重新创建代理),因此首选方法是使用一种非常通用的接触点方法(根据给定的枚举参数决定如何行动。

这对我来说听起来很臭,但是我找不到关于这个问题的任何信息(搜索关键词的选择不好?可能)。 任何建议,或者可能是有用的链接?

谢谢!

5 个答案:

答案 0 :(得分:3)

您无需再次生成代理,只需确保使用正确的接口版本构建客户端即可。如果你非常小心并且只添加方法,而不是删除或修改,那也可以正常工作。当然,这是管理的很多责任。

要使用界面而不是生成客户端代理,请不久前查看我的问题:

WCF Service Reference generates its own contract interface, won't reuse mine

答案 1 :(得分:3)

您在这里混淆了一些术语,我认为您可能指的是.Net 3.5 SP1中已修复的已知缺陷。

重新创建WCF代理在运行时曾经是一项昂贵的操作。在.Net 3.5中已对此进行了改进,以透明地缓存代理对象MSDN Blog

如果您指的是代理的“代码维护”,那么您所指的只是在客户端实现接口。如果您需要维护接口,那么这将回到基本的SOA。如果您的服务提供访问权限和尽可能多的信息,假设您的服务将用于您尚未考虑的目的,那么您可能不需要在创建后修改界面。您还应该考虑升级路径。

Juval Lowy在他的书中对这个问题进行了很好的讨论,这本书有点密集,但其中有一些非常好的信息。

一条建议:WCF具有许多旨在使您的代码非常简单和优雅的功能。如果您对维护感到厌烦,那么您可能要做的就是编写一个界面:

string ServiceMethod(string xml) //returns XML

不要这样做。花点时间设计一个良好的可维护界面和良好的数据/消息合同。这将让WCF在托管您的服务以进行交互时免费提供所有额外内容。

答案 2 :(得分:2)

通用(如在非特定的,单片的)接口很难理解和编程。不将单个方法定义为API的原因是客户无法理解正在发生的事情,当您更改此接口的(隐式)API时,您的客户端将以可怕的方式中断,而您将无法检测到编译时间。

自从我触及WCF以来已经有一段时间了,但如果您的客户端是内部的(相同的代码库,版本控制和部署方案),那么重新生成WCF代理非常容易,拥有“强大”的详细API将使您的生活变得如此比通用的更容易。

答案 3 :(得分:1)

这取决于你的意思是什么样的改变。改变服务合同确实代价高昂,不应该发生。服务合同(或应该)具有足够高的粒度级别,这种变化非常罕见。

更常见的是对服务上公开的类型的更改。这些更改更为常见,因此您需要以尽可能避免破坏现有客户端的方式处理您的更改。

有几种方法可以做到这一点,例如使用接口以多态方式公开您的类型,但最简单的方法是简单地确保在添加新数据成员字段时对类型进行更改并使新字段成为非必需字段。如果您可以限制对这些更改,那么这对现有客户端的影响最小,并使新客户端能够使用新字段。

希望这有帮助。

答案 4 :(得分:0)

确实,修改服务契约(接口)还需要客户端使用新发布的WSDL在其末端重新创建代理类,甚至可能要求客户端将其代码更改为新代理。我不认为你可以创建这样一个通用的界面,可以处理合同中的所有变化。合同必须非常仔细地编写,以便它不会经常更改,如果需要更改合同,那么最好使用不同的版本部署服务,以便您的旧客户端仍然可以使用旧版本