【问题标题】:How to remove xml namespace when return type is generic type in wcf restful service当返回类型是 wcf RESTful 服务中的泛型类型时如何删除 xml 命名空间
【发布时间】:2011-11-08 20:45:10
【问题描述】:

下面是接口定义。

[OperationContract]
[WebGet(UriTemplate = "FacebookData/?accessToken={accessToken}")]
OperationResult<FacebookData> GetFacebookData(string accessToken);

返回类型为OperationResult&lt;FacebookData&gt;,是泛型类型

然后我会得到如下的xml...

OperationResultOfFacebookDataNcCATIYq xmlns:i="http://www.w3.org/2001/XMLSchema-instance"

如何删除命名空间并将 xml 元素重命名为“OperationResult”

顺便说一句,我已经设置命名空间为空

[DataContract(Namespace = "")]
public class OperationResult<T>

但我认为泛型类型会由每个 T 生成类。

【问题讨论】:

  • 代码缩进四个空格。

标签: c# .net wcf rest


【解决方案1】:

要删除 xmlns,您需要创建自己的序列化程序以绕过 WCF 完成的序列化。

界面:

 [ServiceContract]
    public interface IService
    {
        [OperationContract]
        [WebInvoke(UriTemplate = "ProcessMessage")]
        AResponse ProcessMessage(ARequest content);
    }

服务: //将行为更改为适合您的行为

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
    public class Service : IService
    {
        public AResponse ProcessMessage(ARequest content)
        {
         //todo  
        }
    }

最重要的来了:

[XmlRoot("My_Root", Namespace = "")]
ARequest : IXmlSerializable
{
    public string PropertyA { get; set; }

        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return (null);
        }

        public void ReadXml(System.Xml.XmlReader reader)
        {
            if (!reader.IsEmptyElement)
            {
                reader.ReadStartElement();
                PropertyA = reader.ReadElementString("PropertyA");
                reader.ReadEndElement();
            }
        }

        public void WriteXml(System.Xml.XmlWriter writer)
        {
            writer.WriteElementString("PropertyA", PropertyA);

        }

}

【讨论】:

    【解决方案2】:

    您可以使用[DataContract(Name = "OperationResult")],但实际上泛型在概念上不会与 RESTful 服务的概念混为一谈。

    我建议创建一个像 class FacebookOperationResult : OperationResult&lt;FacebookData&gt; {} 这样的新类,然后将其用作您的返回类型。

    【讨论】:

    • 嗨,谢谢,[DataContract(Name = "OperationResult")] 用于设置 xml 元素名称,FacebookOperationResult 也可以解决命名空间问题;但唯一的问题是该类具有系统通用类属性,即: List 或数组,即: int[];
    【解决方案3】:

    实现这一点的一种方法是实现IDispatchMessageInspector - 这允许检查和修改任何您想要/需要的请求/回复内容...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 2019-04-10
      • 2011-02-05
      • 2018-04-30
      • 1970-01-01
      相关资源
      最近更新 更多