2011-09-02 61 views
0

以下是接口定义。当返回类型是wcf安静服务中的泛型类型时如何移除xml名称空间

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

返回类型是OperationResult<FacebookData>,它是一个通用型

然后,我会得到XML像下面...

OperationResultOfFacebookDataNcCATIYq的xmlns:I =“HTTP://www.w3。组织/ 2001/XMLSchema的实例”

如何删除命名空间,并重新命名XML元素为‘OperationResult’

顺便说一句,我已经设置Namesp王牌空

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

,但我认为泛型类型会被每一个T.

+0

请缩进代码空间。 – SLaks

回答

0

一种方法生成的类要做到这一点,是落实IDispatchMessageInspector - 这允许检查和修改任何请求/应答内容,反正你想要/需要...

2

你可以做[DataContract(Name = "OperationResult")]但真正的泛型概念上不会混用RESTful服务的想法。

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

+0

嗨,谢谢,[DataContract(Name =“OperationResult”)]正在为设置xml元素名称工作,FacebookOperationResult也可以解决名称空间问题;但唯一的问题是该类具有系统泛型类属性,即:列表或数组,即:int []; – Clover

0

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

接口:

[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); 

     } 

}