wcf restful服务中返回类型为泛型时如何删除xml命名空间

本文关键字:何删除 删除 命名空间 xml 服务 restful 返回类型 泛型 wcf | 更新日期: 2023-09-27 18:07:22

接口定义如下:

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

返回类型是OperationResult<FacebookData>,它是泛型类型

然后我将得到如下xml…

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

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

顺便说一下,我已经设置了Namespace is empty

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

,但我认为泛型类型将生成类每t

wcf restful服务中返回类型为泛型时如何删除xml命名空间

您可以做[DataContract(Name = "OperationResult")],但实际上泛型在概念上不能与RESTful服务的思想混合。

我建议创建一个新的类,如class FacebookOperationResult : OperationResult<FacebookData> {},然后使用它作为你的返回类型。

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

要删除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);
        }
}