2011-10-26 44 views
3

我构建了一个WCF Rest服务来为另一个进程提供数据。假设他的名字是GetData。 这一个提供具有该结构的XML响应:定义WCF XML响应模式

<?xml version="1.0" encoding="utf-8"?> 
<GetDataResponse xmlns="http://tempuri.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <GetDataResult> 
    <DataMessage> 
     <a></a> 
     <b></b> 
     <c></c> 
    </DataMessage> 
    </GetDataResult> 
</GetDataResponse> 

服务接口:

[XmlSerializerFormat] 
    [OperationContract(Name = "GetData")] 
    [WebInvoke(Method = "GET", 
       ResponseFormat = WebMessageFormat.Xml, 
       BodyStyle = WebMessageBodyStyle.Wrapped, 
       UriTemplate = "Data/{Param}")] 
    List<DataMessage> GetData(string Params); 

我想保存它,继DataMessage类后反序列化XML。所以,我想有这样的模式:

<?xml version="1.0" encoding="utf-8"?> 
<DataMessages xmlns="http://tempuri.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <DataMessage> 
     <a></a> 
     <b></b> 
     <c></c> 
    </DataMessage> 
</DataMessages> 

我应该怎么做来定义服务响应模式有它这样的吗?

谢谢。

回答

6

您可以使用System.Xml.Serialization名称空间中的某些属性来定义映射到您拥有的模式的对象图。下面的代码是这样做的。

public class StackOverflow_7905186 
{ 
    [XmlType(TypeName = "DataMessage", Namespace = "http://tempuri.org/")] 
    public class DataMessage 
    { 
     public string a; 
     public string b; 
     public string c; 
    } 
    [XmlRoot(ElementName = "DataMessages", Namespace = "http://tempuri.org/")] 
    public class DataMessages 
    { 
     [XmlElement(ElementName = "DataMessage")] 
     public List<DataMessage> Messages; 
    } 
    [ServiceContract] 
    public class Service 
    { 
     [XmlSerializerFormat] 
     [OperationContract(Name = "GetData")] 
     [WebGet(ResponseFormat = WebMessageFormat.Xml, 
       BodyStyle = WebMessageBodyStyle.Bare, 
       UriTemplate = "Data/{Param}")] 
     [return: MessageParameter(Name = "DataMessages")] 
     public DataMessages GetData(string Param) 
     { 
      return new DataMessages 
      { 
       Messages = new List<DataMessage> 
       { 
        new DataMessage 
        { 
         a = "1", 
         b = "2", 
         c = "3", 
        } 
       } 
      }; 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     WebClient c = new WebClient(); 
     Console.WriteLine(c.DownloadString(baseAddress + "/Data/foo")); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
}