Ответ 1
Просто: аргументы по умолчанию не поддерживаются.
По дизайну и по причине. Мы используем С# для записи контрактов WCF, но это новаторский трюк. Не все возможности языка С# могут быть реализованы в SOAP, REST или JSon.
В моем интерфейсе я заявил об этом.
[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");
Просто: аргументы по умолчанию не поддерживаются.
По дизайну и по причине. Мы используем С# для записи контрактов WCF, но это новаторский трюк. Не все возможности языка С# могут быть реализованы в SOAP, REST или JSon.
Вы можете попробовать это, перегрузив функцию.
[OperationContract]
MyResponse GetData();
[OperationContract(Name = "GetDataByFilter")]
MyResponse GetData(string filter);
Тогда другой вариант - использовать DataContract
вместо нескольких параметров и установить IsRequired
на false на соответствующих DataMember
s, как описано в на этот вопрос.
Я заставляю компилятор ныть и плакать о каком-либо методе с сигнатурой одного параметра.
Начните с начала. То, что ваш компилятор "скулит", заключается в том, что служба не распознает необязательные параметры со значениями по умолчанию, поэтому просто выведет метод, требующий всех параметров. На основе этих метаданных вы создаете клиентский прокси ( "Service Reference" ), который также не содержит ожидаемого вами метода; он видит только метод, предоставляемый службой: тот, у которого есть подпись (String beep, String boop)
. Поэтому, в конце концов, вы получаете ошибку компиляции при попытке вызвать несуществующий метод для класса.
Теперь, когда вы вызываете этот метод в службе, ваш клиент должен будет предоставить оба значения. Если вы закажете null
, служба увидит null
, так как значения параметров по умолчанию должны быть скомпилированы в вызывающий. WCF не поддерживает это, поэтому вам просто нужно создавать перегрузки, как предлагал @StephenBorg.
Вы можете сделать это следующим образом:
[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);
вы должны проверить код, сгенерированный при добавлении ссылки на службу.
поскольку код генерируется из WISDL, где подпись (псевдо):
GetStuff(String , String )
он генерирует код соответственно, не зная о дополнительных параметрах. поэтому, если вы хотите лениться, вы должны изменить созданный класс прокси или, как предложил @Stephen Borg, перегрузить функцию.