Почему перегрузка метода не допускается в 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.