Подтвердить что ты не робот

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

Я хочу построить webservice с этой сигнатурой, которая не генерирует исключение, если 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, которые я еще не использовал.

4b9b3361

Ответ 1

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

Ответ 2

Если вам действительно нужно выполнить это, здесь тип hack для конкретного случая веб-метода, который имеет только примитивные типы в качестве параметров:

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

    [WebMethod]
    public SomeResult SomeMethod([DefaultValue(true)] bool optionalParam)
    result:
    <s:element minOccurs="0" maxOccurs="1" default="true" name="optionalParam" type="s:boolean" />