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


75

假设这是一个 ServiceContract

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

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

}

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


13
我不确定这是否是正确的答案,所以我将其发表为评论。我相信这是因为WCF旨在与尽可能多的协议(即非Microsoft技术)一起使用。重载是.Net和其他几种语言(但不是全部)的功能。为了最大化服务的可用性,不允许超载。(我认为)
Smudge202

似乎对我来说是一个很好的答案。
Avner Shahar-Kashtan '04年

Answers:


103

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

28

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

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


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.