为啥 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

要解决此问题,您可以显式指定OperationContractName 属性。

[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 中不允许方法重载?的主要内容,如果未能解决你的问题,请参考以下文章

“重载”方法的 WCF 最佳实践

为啥 C# 可以重载具有相同参数的两个方法,只要其中一个具有默认参数?

为啥我要重载方法?

为啥“避免方法重载”?

为啥 ruby​​ 不支持方法重载?

为啥这行得通?方法重载+方法覆盖+多态