【问题标题】:WCF Message Contract namespace issueWCF 消息合同命名空间问题
【发布时间】:2011-03-29 20:29:25
【问题描述】:

我有以下 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 是什么意思?

【问题讨论】:

    标签: wcf


    【解决方案1】:

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

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

    如果您的客户端完全符合 XML,那么这对您来说根本不是问题。但是,有一些不兼容的 SOAP 客户端工具集对命名空间声明的处理很挑剔。如果你很不走运,你可能会发现你有一个被未使用的命名空间前缀声明弄糊涂了。

    【讨论】:

    • 你的猜测太棒了!我正在使用GetUserRightsResponseMessage 中的属性,它返回GetUserRightsResponse 的一个实例,它是数据合同(但使用XmlSerialzer 与ASMX 客户端向后兼容。我能做些什么来避免这种情况?我正在移动我现有的WSE3 web为 WCF 提供服务,使它们与现有客户端向后兼容。您是否认为客户端有可能不符合 SOAP(因为 WSE3)?
    • 我不知道有任何客户端 SOAP 工具包可以与 WSE3 愉快地互操作,但不能正确理解命名空间,所以你可能没问题。
    【解决方案2】:

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

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

    xmlns:a="http://schemas.datacontract.org/2004/07/MyMessageContract.MessageContracts" 指向 Microsoft 的消息协定架构。现在这似乎没有在你发布的 sn-p 中使用,所以我很惊讶它在那里,但这是一个 innocent 命名空间,因为你没有任何元素或属性命名空间。

    【讨论】:

    • 感谢您的回复。为什么会自动添加?我记得我没有在任何地方指定它。 xmlns:a 和 xmlns:i 是什么意思以及何时使用它们?我的客户是现在调用 WCF 服务的 ASMX 客户。我也需要在客户端检查一些东西吗?
    • 这是serializer 这样做的。 xmlns:i 是强制性的,因为它是 Xml 实例命名空间并定义诸如 i:nil 或 i:any 之类的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多