Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么WCF中不允许方法重载?_C#_.net_Wcf_Overloading - Fatal编程技术网

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

C# 为什么WCF中不允许方法重载?,c#,.net,wcf,overloading,C#,.net,Wcf,Overloading,假设这是一份服务合同 [ServiceContract] public interface MyService { [OperationContract] int Sum(int x, int y); [OperationContract] int Sum(double x, double y); } 方法重载在C#中是允许的,但WCF不允许重载操作契约 托管程序在托管时将抛出一个invalidoOperationException,简而言之,不能重载方法的

假设这是一份
服务合同

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

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

}
方法重载在C#中是允许的,但WCF不允许重载
操作契约

托管程序在托管时将抛出一个
invalidoOperationException
,简而言之,不能重载方法的原因与WSDL不支持C#中的相同重载概念有关。下面的文章详细介绍了为什么这是不可能的

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

[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,也不允许在其框架中使用
操作符/方法重载。如果是这种情况,那么这些框架将无法使用此方法,因此为了确保其普遍可用,WCF不允许并在
OperationContract
属性中为您提供名称属性,以指定不同的名称。如果客户机是.NET,则WCF将自动将其显示为方法重载,否则它将使用name属性中指定的名称生成新方法

我不确定这是不是正确的答案,所以我会发表评论。我相信这是因为WCF被设计为使用尽可能多的协议,即非微软技术。重载是.Net和其他一些语言(但不是所有语言)的一项功能。为了最大限度地提高服务的可用性,不允许超载。(我想)对我来说似乎是个好答案。