WCF消息协定命名空间问题

时间:2011-03-29 11:54:02

标签: wcf

我有以下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/07xmlns:a是什么意思?

2 个答案:

答案 0 :(得分:0)

据我所见,你没有得到错误的命名空间。

所有元素都设置为"urn:MyNamespace:Authorization",我想是AuthorizationXmlElementNames.Namespace

xmlns:a="http://schemas.datacontract.org/2004/07/MyMessageContract.MessageContracts"指向Microsoft的邮件合同架构。现在,这似乎没有在您发布的代码段中使用过,所以我很惊讶它完全存在,但这是一个无辜的命名空间,因为您在该命名空间中没有任何元素或属性。

答案 1 :(得分:0)

两个GetUserRightsResponse元素都在名称空间"urn:MyNamespace:Authorization"中,因为外部名称的默认名称空间声明由内部元素继承。

xmlns:a="http://schemas.datacontract.org/2004/07/MyMessageContract.MessageContracts"是一个名称空间声明,它定义了一个名称空间前缀(“a”),它实际上并未在您的消息中使用。因此它对XML消息的含义完全没有影响,可以省略。它的存在是微软实现的一个怪癖,可能是由你的消息包装元素名称和数据契约名称之间的命名冲突引起的(但我只是猜测这个)。

如果您的客户完全符合XML标准,那么这对您来说应该不是问题。但是,有一些不兼容的SOAP客户端工具集对于命名空间声明的处理非常繁琐。如果你非常不走运,你可能会发现你有一个被未使用的命名空间前缀声明搞糊涂的东西。