为啥 WCF 中不允许方法重载?
Posted
技术标签:
【中文标题】为啥 WCF 中不允许方法重载?【英文标题】:Why method overloading is not allowed in WCF?为什么 WCF 中不允许方法重载? 【发布时间】:2012-05-03 19:17:20 【问题描述】:假设这是ServiceContract
[ServiceContract]
public interface MyService
[OperationContract]
int Sum(int x, int y);
[OperationContract]
int Sum(double x, double y);
C#中允许方法重载,但WCF不允许你重载operation contracts
托管程序将在托管时抛出InvalidOperationException
【问题讨论】:
我不确定这是正确的答案,所以我会发表评论。我相信这是因为 WCF 旨在使用尽可能多的协议,即非 Microsoft 技术。重载是 .Net 和其他一些语言的一个特性,但不是全部。为了最大限度地提高服务的可用性,不允许重载。 (我认为) 对我来说似乎是一个很好的答案。 【参考方案1】:简而言之,不能重载方法的原因与 WSDL 不支持 C# 中存在的相同重载概念有关。以下帖子详细说明了为什么这是不可能的。
http://jeffbarnes.net/blog/post/2006/09/21/Overloading-Methods-in-WCF.aspx
要解决此问题,您可以显式指定OperationContract
的Name
属性。
[ServiceContract]
public interface MyService
[OperationContract(Name="SumUsingInt")]
int Sum(int x, int y);
[OperationContract(Name="SumUsingDouble")]
int Sum(double x, double y);
【讨论】:
【参考方案2】:因为在通过 HTTP/SOAP 调用时,合同中的方法名称相同意味着无法确定客户端将要调用的特定方法。
请记住,当通过 http 调用 Web 方法时,参数是可选的,如果缺少参数,则使用默认值进行初始化。这意味着这两种方法的调用在 HTTP/SOAP 上看起来可能完全相同。
【讨论】:
【参考方案3】:原因是 WCF 应该被不同的客户端普遍使用,而这些客户端不必是 .NET,也可能不允许在其框架中使用 Operator/Method overloading
。如果是这种情况,那么这些框架将无法使用此方法,因此为了确保它普遍可用,WCF 不允许并在 OperationContract
属性中为您提供 name 属性来指定不同的名称。如果客户端是 .NET,则 WCF 将自动将其显示为方法重载,否则它将生成一个具有在 name 属性中指定的名称的新方法。
【讨论】:
以上是关于为啥 WCF 中不允许方法重载?的主要内容,如果未能解决你的问题,请参考以下文章