Могу ли я иметь необязательный параметр для веб-службы ASP.NET SOAP

Я хочу создать веб-службу с этой сигнатурой, которая не генерирует исключение, если param2 остается пустым. Это возможно?

[WebMethod] public string HelloWorld(string param1, bool param2) { } 

Исключением является исключение System.ArgumentException, которое возникает при попытке преобразовать пустую строку в логическое.

Идеи, которые пока не сработали:

  • перегрузка метода не допускается для веб-сервисов, например

     public string HelloWorld(string param1) { return HelloWorld(param1, false); } 

как предлагается здесь :

  • сделать bool nullable bool? , Такое же исключение.
  • манипулировать WSDL, см. этот ответ

Мой вопрос связан с этим вопросом , но единственный ответ указывает на контракты WCF, которые я еще не использовал.

У вас может быть перегруженный метод в веб-службах с атрибутом MessageName. Это является обходным решением для достижения функциональности перегрузки.

Посмотрите http://msdn.microsoft.com/en-us/library/byxd99hx%28VS.71%29.aspx

 [WebMethod(MessageName="Add3")] public double Add(double dValueOne, double dValueTwo, double dValueThree) { return dValueOne + dValueTwo + dValueThree; } [WebMethod(MessageName="Add2")] public int Add(double dValueOne, double dValueTwo) { return dValueOne + dValueTwo; } 

Эти методы будут видны как Add2 и Add3 для внешних.

Если вы ДЕЙСТВИТЕЛЬНО должны выполнить это, вот что-то вроде взлома для конкретного случая веб-метода, который имеет только примитивные типы в качестве параметров:

 [WebMethod] public void MyMethod(double requiredParam1, int requiredParam2) { // Grab an optional param from the request. string optionalParam1 = this.Context.Request["optionalParam1"]; // Grab another optional param from the request, this time a double. double optionalParam2; double.TryParse(this.Context.Request["optionalParam2"], out optionalParam2); ... } 

Я знаю, что этот пост немного стар. Но я думаю, что имена методов должны быть одинаковыми для примера из Rasik. Если оба имени метода одинаковы, тогда там происходит перегрузка. Я думаю, это должно быть так.

 [WebMethod(MessageName="Add3")] **public double Add(double dValueOne, double dValueTwo, double dValueThree)** { return dValueOne + dValueTwo + dValueThree; } [WebMethod(MessageName="Add2")] **public int Add(double dValueOne, double dValueTwo)** { return dValueOne + dValueTwo; } 

Вы не можете перегружать методы веб-службы. Протокол SOAP не поддерживает его. Код Расика – обходной путь.

Сделайте все необязательные строки аргументов. Если аргумент не передан, вход считается нулевым.

В соответствии с поддержкой привязки атрибутов MinOccurs и поддержкой привязки атрибутов по умолчанию :

  1. Тип значения, сопровождаемый общедоступным полем bool, которое использует соглашение с указанным именованием, описанное ранее в разделе Перевод XSD в исходное значение – minOccurs значение output element 0.

     [WebMethod] public SomeResult SomeMethod(bool optionalParam, [XmlIgnore] bool optionalParamSpecified) 

    результат:

      

  2. Тип значения со значением по умолчанию, заданным с помощью System.Component.DefaultValueAttribute – значение minOccurs элемента output В значение по умолчанию также указывается с помощью атрибута XML по умолчанию.

     [WebMethod] public SomeResult SomeMethod([DefaultValue(true)] bool optionalParam) 

    результат:

      

Давайте будем гением компьютера.