为什么 WCF 中不允许方法重载



假设这是一个ServiceContract

[ServiceContract]
public interface MyService
{
    [OperationContract]
    int Sum(int x, int y);
    [OperationContract]
    int Sum(double x, double y);
}

C# 中允许方法重载,但 WCF 不允许重载operation contracts托管程序将在托管时抛出InvalidOperationException

简而言之,不能重载方法的原因与 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);
}

因为当通过 HTTP/SOAP 调用时,在合约中使用相同的方法名称意味着无法确定客户端将要调用的特定方法。

请记住,通过 http 调用 Web 方法时,参数是可选的,如果缺少,则使用默认值进行初始化。这意味着这两种方法的调用在 HTTP/SOAP 上看起来可能完全相同。

原因是 WCF 应该被不同的客户端普遍使用,这些客户端不必是 .NET,也可能不允许在其框架中Operator/Method overloading。如果是这种情况,则此方法将无法被这些框架使用,因此为了确保它普遍可用,WCF 不允许并在 OperationContract 属性中为您提供 name 属性以指定其他名称。如果客户端是 .NET,则 WCF 会自动将其显示为方法重载,否则它将生成具有 name 属性中指定的名称的新方法。

最新更新