Чому перевантаження методів не допускається у WCF?


75

Припустимо, що це a 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

Мені здається гарною відповіддю.
Авнер Шахар-Каштан

Відповіді:


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 аргументи є необов'язковими та ініціалізуються значеннями за замовчуванням, якщо відсутні. Це означає, що виклик обох методів може виглядати абсолютно однаково через HTTP / SOAP.


1

Причиною є те, що WCF повинен бути універсально придатним для використання різними клієнтами, і ці клієнти не повинні бути .NET і, можливо, також не дозволяти Operator/Method overloadingв своїх рамках. Якщо це так, тоді цей метод стає непридатним для використання в цих фреймворках, і тому, щоб переконатись, що він універсальний, WCF забороняє і надає вам властивість name в OperationContractатрибуті, щоб вказати інше ім'я. Якщо клієнт є .NET, то WCF автоматично покаже його як перевантаження методу, але в іншому випадку він генерує новий метод з іменем, зазначеним у властивості name.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.