Почему перегрузка метода не допускается в WCF?

Предположим, что это ServiceContract

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

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

}

Перегрузка метода разрешена в С#, но WCF не позволяет перегружать operation contracts Хостинг-программа бросит InvalidOperationException при хостинге

Ответ 1

Вкратце, причина, по которой вы не можете перегружать методы, связана с тем, что WSDL не поддерживает те же концепции перегрузки, которые присутствуют внутри С#. В следующем сообщении содержится подробная информация о том, почему это невозможно.

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);
}

Ответ 2

Потому что при вызове через HTTP/SOAP наличие того же имени метода в вашем контракте означает, что нет способа определить, какой конкретный метод вызывает клиент.

Помните, что при вызове веб-методов через http аргументы являются необязательными и инициализируются значениями по умолчанию, если они отсутствуют. Это означает, что вызов обоих методов может выглядеть точно так же по HTTP/SOAP.

Ответ 3

Причина в том, что WCF должен универсально использоваться разными клиентами, и эти клиенты не обязательно должны быть .NET и могут также не разрешать использование Operator/Method overloading в своих инфраструктурах. Если это так, то этот метод становится непригодным для этих структур и, следовательно, для обеспечения его универсального использования WCF запрещает и предоставляет вам свойство name в атрибуте OperationContract, чтобы указать другое имя. Если клиент является .NET, то WCF автоматически покажет его как перегрузку метода, но в противном случае он создаст новый метод с именем, указанным в свойстве name.