Не удается использовать необязательные параметры при реализации интерфейса для WCF

В моем интерфейсе я объявил это.

[OperationContract]
[WebGet]
String GetStuff(String beep, String boop = "too lazy to type");

Я реализовал это следующим образом.

String GetStuff(String beep, String boop = "too lazy to type") { ... }

Он компилируется и загружается как мой сервис WCF. Однако, когда я использовал его в качестве веб-ссылки и попытался выполнить приведенный ниже код, я обнаружил, что компилятор ныть и рыдать о том, что нет метода с сигнатурой одного параметра. Последняя строка - это проблема.

Как я могу бытьлень набирать по умолчанию?

ServiceClient client = new ServiceClient();
client.GetStuff("blobb", "not lazy");
client.GetStuff("blobb");
 Konrad Viltersten11 июн. 2013 г., 15:29
@HenkHolterman Много хороших ответов здесь. Не могли бы вы дать свое простое объяснение в качестве ответа, чтобы я мог проверить его зеленым, пожалуйста. "Def args не поддерживается " лучший ответ на мою проблему. :)
 Henk Holterman11 июн. 2013 г., 13:51
Перегрузка неработать с WCF.
 Kippie11 июн. 2013 г., 13:44
Почему бы просто не перегрузить метод и заставить один метод вызывать другой с помощью "Boop» поставляется?

Ответы на вопрос(5)

сгенерированный при добавлении сервисной ссылки.

поскольку код генерируется из WISDL, где подпись (псевдо):

GetStuff(String , String )

он генерирует код соответственно, не зная о необязательных параметрах. поэтому, если вы хотите стать ленивым, вы должны изменить сгенерированный прокси-класс или, как предложил @Stephen Borg, перегрузить функцию.

Вы можете сделать это так:

[DataContract]
public class GetStuffParams
{
    [DataMember]
    string beep {get; set; }

    [DataMember]
    string boop  {get; set;}


    public GetStuffParams() { boop = "too lazy to type"; }
}


[OperationContract]
[WebGet]
String GetStuff(GetStuffParams stuffParams);
Решение Вопроса

По замыслу и разуму. Мы используем C # для написания контрактов WCF, но этоЭто нотационный трюк. Не каждая функция языка C # может быть реализована в SOAP, REST или JSon.

что компилятор ныть и рыдать о том, что нет метода с сигнатурой одного параметра.

Начните с начала. Это твой компиляторноет» это потому, что служба не распознает необязательные параметры со значениями по умолчанию, поэтому она просто предоставит метод, требующий все параметры. На основе этих метаданных вы создаете клиентский прокси ("Сервисный справочник »), который также неt содержит метод, который вы ожидаете; он видит только метод, предоставляемый службой: тот, у которого(String beep, String boop) подпись. Чтобы'почему в конце вы получаете ошибку компиляции при попытке вызвать несуществующий метод в классе.

Теперь, когда вы вызываете этот метод в службе, ваш клиент должен будет предоставить оба значения. Если вы поставитеnull, сервис увидитnull, так как значения параметров по умолчанию должны быть скомпилированы в вызывающей стороне. WCF не поддерживает это, поэтому выЯ просто должен создать перегрузки, как предложил @StephenBorg.

Вы можете попробовать это, перегружая функцию.

[OperationContract]
MyResponse GetData(); 

[OperationContract(Name = "GetDataByFilter")]
MyResponse GetData(string filter);

Тогда другой вариант заключается в использованииDataContract вместо нескольких параметров, и установитеIsRequired ложь на соответствующемDataMemberс, как объяснено вэтот вопрос.

Ваш ответ на вопрос