Могу ли я иметь необязательный параметр для веб-службы 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, которые я еще не использовал.
Ответы
Ответ 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" />