2011-10-26 22 views
3

別のプロセスのデータを提供するWCF Restサービスを構築します。彼の名前はGetDataだとします。 この1つは、この構造を持つ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(); 
    } 
}