Требуют ли свойства .Net WebService WSDL сложных типов иметь свойства Get / Set? - PullRequest
1 голос
/ 21 февраля 2011

Я определяю веб-сервис, который вызывает сервисную библиотеку.В библиотеке сервиса есть объект под названием customer с идентификатором клиента, который определяется следующим образом:

public class Customer
{
    private int _customerID;
    public int CustomerID
    {
        get { return _customerID; }
    }
}

Когда я пытаюсь передать объект customer через мой веб-сервис, создается впечатление, что сгенерированный WSDL не включаетсвойство CustomerID, если я не определю сеттер.Кажется, что в некоторых обстоятельствах требование установки является нежелательным.Я что-то упустил или для создания WSDL требуется свойство, чтобы иметь геттер / сеттер, чтобы быть доступным клиенту?

Ответы [ 3 ]

3 голосов
/ 21 февраля 2011

Другие ответы верны, но не упоминайте, что это ограничение XML-сериализатора, который используется веб-сервисами ASMX.

Веб-сервисы ASMX теперь считаются Microsoft «устаревшей технологией» и не должны использоваться для разработки новых сервисов.Их замена, WCF, не имеет этого ограничения.

0 голосов
/ 21 февраля 2011

Требуется установщик, чтобы .Net мог установить свойство после передачи (во время десериализации). Вы можете решить эту проблему, реализовав свой собственный объект или, возможно, установив его как внутреннее: internal set { }

На самом деле это скорее вопрос безопасности, поэтому он должен поддерживаться, но поведение .Net по умолчанию - это отображение 1-1 свойств в WSDL. Если внутренний установщик не работает (я ожидаю, что он не будет), и вы не хотите беспокоиться о пользовательском ser / deser, тогда просто добавьте throw new SecurityException() к установщику.

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

РЕДАКТИРОВАТЬ: Как @Джон Сондерс указывает, что ограничение сеттера может отсутствовать в WCF.

0 голосов
/ 21 февраля 2011

Посмотрите, поможет ли это: http://support.microsoft.com/kb/313584

Похоже, что это требование; вы можете создать исключение, если клиент попытается установить это свойство.

По ссылке, которую я разместил

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

Public Property Id() As Integer
    Get
        Return nID
    End Get
    Set(ByVal Value As Integer)
        Throw New Exception("Cannot set read-only property 'Id'")
    End Set
End Property

Ваш может стать:

public class Customer
{
    private int _customerID;
    public int CustomerID
    {
        get { return _customerID; }
        set { throw new exception("Cannot set value!"); }
    }

}
...