Проблема пространства имен контракта сообщения WCF - PullRequest
0 голосов
/ 29 марта 2011

У меня есть следующее MessageContract

 [MessageContract(IsWrapped = true, WrapperName = AuthorizationXmlElementNames.ElementNames.GetUserRightsResponse, 
        WrapperNamespace = AuthorizationXmlElementNames.Namespace)]
    public class GetUserRightsResponseMessage
    {
        #region Properties

        /// <summary>
        /// Gets or sets GetUserRightsResponse.
        /// </summary>
        [MessageBodyMember(Namespace = AuthorizationXmlElementNames.Namespace)]
        public GetUserRightsResponse GetUserRightsResponse { get; set; }

        /// <summary>
        /// Gets or sets ResponseHeader.
        /// </summary>
        [MessageHeader(
            Name = XmlCoreElementNames.ElementNames.ResponseHeader, 
            Namespace = XmlCoreElementNames.Namespace,
            ProtectionLevel = ProtectionLevel.None)]
        public ResponseHeader ResponseHeader { get; set; }

        #endregion
    }

Класс GetUserRightsResponse выглядит следующим образом

[XmlRoot(ElementName = AuthorizationXmlElementNames.ElementNames.GetUserRightsResponse, 
        Namespace = AuthorizationXmlElementNames.Namespace, IsNullable = false)]
    [Serializable]
    //[MessageContract(WrapperName = AuthorizationXmlElementNames.ElementNames.GetUserRightsResponse, WrapperNamespace = AuthorizationXmlElementNames.Namespace)]
    public class GetUserRightsResponse
    {
        #region Constructors and Destructors

        /// <summary>
        /// Initializes a new instance of the <see cref="GetUserRightsResponse"/> class. 
        /// Initialize a new instance of the <see cref="GetUserRightsResponse"/> class.
        /// </summary>
        public GetUserRightsResponse()
        {
            this.UserServiceAccesses = new UserServiceAccesses();
        }

        #endregion

        #region Properties

        /// <summary>
        /// Gets or sets the user rights for the current user.
        /// </summary>
        //[MessageBodyMember(Namespace = AuthorizationXmlElementNames.Namespace)]
        public UserServiceAccesses UserServiceAccesses { get; set; }

        #endregion
    }

XmlCoreElementNames.Namespace - это постоянная строка для пространства имен, значение которой равно urn:MyNamespace:Authorization

Я возвращаю экземпляр GetUserRightsResponseMessage из моего контракта на эксплуатацию. Но я всегда получаю неправильное пространство имен для экземпляра GetUserRightsResponse, содержащегося в возвращаемом объекте. Возвращенная часть XML выглядит следующим образом.

<s:Body u:Id="_0">
   <GetUserRightsResponse xmlns="urn:MyNamespace:Authorization">
      <GetUserRightsResponse i:nil="true" 
            xmlns:a="http://schemas.datacontract.org/2004/07/MyMessageContract.MessageContracts" 
            xmlns:i="http://www.w3.org/2001/XMLSchema-instance" />
   </GetUserRightsResponse>
</s:Body>

Почему я всегда получаю пространство имен xmlns:a="http://schemas.datacontract.org/2004/07 для свойства в возвращаемом объекте? Что означает xmlns:a? 1019 *

Ответы [ 2 ]

0 голосов
/ 29 марта 2011

Оба элемента GetUserRightsResponse находятся в пространстве имен "urn:MyNamespace:Authorization", поскольку объявление пространства имен по умолчанию на внешнем наследуется внутренним.

xmlns:a="http://schemas.datacontract.org/2004/07/MyMessageContract.MessageContracts" - это объявление пространства имен, которое определяет префикс пространства имен ("a"), который фактически не используется в вашем сообщении. Так что это никак не влияет на значение сообщения XML и может быть опущено. Его наличие является следствием реализации Microsoft, возможно, вызванной конфликтом имен между именем вашего элемента оболочки сообщений и именем контракта данных (но я просто догадываюсь об этом).

Если ваши клиенты полностью совместимы с XML, это не должно быть проблемой для вас вообще. Однако есть некоторые несовместимые клиентские наборы инструментов SOAP, которые суетливо относятся к обработке объявлений пространства имен. Если вам очень не повезло, вы можете обнаружить, что у вас есть такой, который смущен неиспользованным объявлением префикса пространства имен.

0 голосов
/ 29 марта 2011

Насколько я понимаю, вы не получаете неправильное пространство имен.

Все элементы установлены на "urn:MyNamespace:Authorization", что, я думаю, составляет AuthorizationXmlElementNames.Namespace.

xmlns:a="http://schemas.datacontract.org/2004/07/MyMessageContract.MessageContracts" балловв схему Microsoft для контрактов сообщений.Теперь это, похоже, не использовалось в опубликованном вами фрагменте, поэтому я удивлен, что он вообще там есть, но это пространство имен innocent , поскольку у вас нет ни одного элемента или атрибута в этом пространстве имен.

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