Параметры службы WCF изменены в клиенте .NET 2.0 - PullRequest
1 голос
/ 24 августа 2009

Я создал службу WCF, которая предоставила метод с одним параметром:

public class Service1 : IService1
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
}

Для службы определены две конечные точки (wsHttpBinding и basicHttpBinding), чтобы она была совместима со старыми клиентами.

Служба прекрасно работает в клиентских приложениях .NET 3.0 и .NET 3.5. Однако при создании клиента .NET 2.0 для метода GetData требуются 2 параметра: целое число (ожидаемое) и параметр bool с именем valueSpecified (неожиданный). Я никогда не определял второй параметр. Почему это происходит и как я могу избавиться от второго параметра?

Ответы [ 3 ]

3 голосов
/ 24 августа 2009

Поскольку типы значений не могут быть нулевыми (в более поздних версиях .net framework нет Nullable<T>) VS, кроме того, чтобы сгенерировать дополнительный параметр, чтобы дать вам возможность не указывать тип значения, вы можете вызвать свой сервисный метод следующим образом .

service.GetData(val,true);

см. этот пост, где Джон Сондерс предлагает добавить атрибут [DataMember(Required = true)] в свойство.

1 голос
/ 24 августа 2009

Точно такой же вопрос был опубликован здесь .

Другой способ избежать создания дополнительного логического параметра на клиентском прокси при использовании .NET 2.0 - переключиться на RPC-стиль, включающий в контракте на обслуживание (по умолчанию для WCF и ASMX используется Стиль документа).
Таким образом, XmlSerializer на клиенте будет гарантировать, что параметр всегда появляется в запросах SOAP , поскольку он является частью спецификации SOAP 1.1, которая применяется при использовании кодировки в стиле RPC .

В WCF вы можете указать стиль кодирования, используя атрибут DataContractFormat, либо на уровне службы, либо на уровне операций.

[ServiceContract]
public interface IService
{
    [OperationContract]
    [DataContractFormat(Style = OperationFormatStyle.Rpc)]
    string GetData(int value);
}

Более подробную информацию о различиях между стилем RPC и стилем документа в SOAP можно найти здесь .

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

0 голосов
/ 24 августа 2009

Вы можете вручную удалить свойство valueSpecified из операции GetData в вашем прокси-классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...