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

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

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

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

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

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

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

как предложено здесь :

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

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

Ответы [ 6 ]

13 голосов
/ 12 ноября 2009

Вы можете использовать перегруженный метод в веб-сервисах с атрибутом 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 снаружи.

12 голосов
/ 11 июля 2013

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

[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);
    ...
}
7 голосов
/ 25 июня 2012

Я знаю, что этот пост немного стар. Но я думаю, что имена методов должны быть одинаковыми для примера из 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;
}
1 голос
/ 10 марта 2014

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

1 голос
/ 12 ноября 2009

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

0 голосов
/ 13 декабря 2017

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

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

    <code>[WebMethod]
    public SomeResult SomeMethod(bool optionalParam, [XmlIgnore] bool optionalParamSpecified)
    результат:
    <code><s:element minOccurs="0" maxOccurs="1" name="optionalParam" type="s:boolean" />
  2. Тип значения со значением по умолчанию, заданным через System.Component.DefaultValueAttribute - minOccurs значение выходного элемента <element> 0. В элементе <element> значение по умолчанию также указывается через атрибут XML по умолчанию.

    <code>[WebMethod]
    public SomeResult SomeMethod([DefaultValue(true)] bool optionalParam)
    результат:
    <code><s:element minOccurs="0" maxOccurs="1" default="true" name="optionalParam" type="s:boolean" />
...