Вызов WebMethod из веб-ссылки с необязательными параметрами в C # - PullRequest
3 голосов
/ 28 октября 2011

Я создал фиктивный веб-сервис с 2 необязательными параметрами, используя .Net Webservices, однако в реальном продукте у нас будет намного больше необязательных параметров (например, фильтры для запроса). Проблема заключается в том, что при вызове веб-службы невозможно не указывать необязательные параметры, т. Е. При каждом вызове веб-службы могут возникать десятки значений NULL при разработке против реального веб-сервиса.

Прямо сейчас этот фиктивный веб-сервис состоит только из этого, чтобы поддерживать 2 необязательных строковых параметра:

[WebMethod]
public string HelloWorld(String PARAM_1="", String PARAM_2="")
{   return "";   }

В WSDL действительно отображаются эти параметры с минимальным значением 0 и максимальным значением 1:

<s:element minOccurs="0" maxOccurs="1" name="PARAM_1" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="PARAM_2" type="s:string"/>

Проблема заключается в следующем: при добавлении этого веб-сервиса через веб-ссылку в Visual Studio 2010 он действительно создает объект службы с помощью метода HelloWorld. Однако это не учитывает необязательные параметры. Он создает функцию HelloWorld без дополнительных параметров. Это всегда требует и PARAM_1, и PARAM_2, поэтому необязательные параметры должны быть заполнены значениями NULL независимо от того, какие из них мы на самом деле хотели бы использовать.

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

public string HelloWorld(string PARAM_1, string PARAM_2) {
object[] results = this.Invoke("HelloWorld", new object[] { PARAM_1, PARAM_2});

Есть ли способ использовать веб-сервисы с дополнительными параметрами в VS2010, не принуждая обнулять потенциальные десятки дополнительных параметров при каждом вызове? Мы хотели бы продолжать использовать удобные веб-ссылки в Visual Studio без необходимости делать это постоянно.

Ответы [ 4 ]

3 голосов
/ 28 октября 2011

Необязательные параметры - это языковая конструкция.Веб-службы на основе SOAP ничего не знают о необязательных параметрах, поскольку веб-службы на основе SOAP не зависят от языка.

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

1 голос
/ 28 октября 2011

Вы можете создать необязательные параметры, если вы поместите все параметры в отдельный класс.Это представляет собой новое сообщение, в котором вы можете самостоятельно принять решение сделать некоторые свойства необязательными.Вы также можете предоставить различные конструкторы в частичном объявлении класса для классов, сгенерированных службой.

Это IMO лучшее решение, чем перегрузка методов, которая даже не работает с веб-службами.Вы должны создать новый и немного другой метод для каждой перегрузки.

1 голос
/ 28 октября 2011

minOccurs = 0 относится к вхождению переменной. Поскольку он имеет тип string minOccurs = 0, поскольку он будет иметь значение по умолчанию.

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

0 голосов
/ 28 октября 2011

Я думаю, что метод рефакторинга для принятия структуры с дюжиной обнуляемых свойств (вместо дюжины параметров) будет иметь смысл.

...