76

假设这是一个ServiceContract

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

    [OperationContract]
    int Sum(double x, double y);

}

C#中允许方法重载,但是WCF不允许你重载operation contracts 宿主程序会抛出一个InvalidOperationExceptionwhile宿主

4

3 回答 3

105

简而言之,不能重载方法的原因与 WSDL 不支持 C# 中存在的相同重载概念有关。以下帖子详细说明了为什么这是不可能的。

http://jeffbarnes.net/blog/post/2006/09/21/Overloading-Methods-in-WCF.aspx

要解决此问题,您可以显式指定Name.OperationContract

[ServiceContract]
public interface MyService
{
    [OperationContract(Name="SumUsingInt")]
    int Sum(int x, int y);

    [OperationContract(Name="SumUsingDouble")]
    int Sum(double x, double y);
}
于 2012-04-23T07:05:32.543 回答
28

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

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

于 2012-04-23T07:07:44.167 回答
1

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

于 2019-10-02T11:36:01.113 回答