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
您可以做[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);
}
}