Невозможно использовать необязательные параметры при реализации интерфейса для WCF - программирование
Подтвердить что ты не робот

Невозможно использовать необязательные параметры при реализации интерфейса для 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");
4b9b3361

Ответ 1

Просто: аргументы по умолчанию не поддерживаются.

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

Ответ 2

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

[OperationContract]
MyResponse GetData(); 

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

Тогда другой вариант - использовать DataContract вместо нескольких параметров и установить IsRequired на false на соответствующих DataMember s, как описано в на этот вопрос.

Ответ 3

Я заставляю компилятор ныть и плакать о каком-либо методе с сигнатурой одного параметра.

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

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

Ответ 4

Вы можете сделать это следующим образом:

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

Ответ 5

вы должны проверить код, сгенерированный при добавлении ссылки на службу.

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

GetStuff(String , String )

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