我构建了一个WCF Rest服务来为另一个进程提供数据。假设他的名字是GetData。 这个提供了具有以下结构的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);
我希望在保存它之后反序列化xml,遵循DataMessage类。所以,我想有这个架构:
<?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>
如何定义服务响应模式以使其具有这样的效果?
谢谢。
答案 0 :(得分: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();
}
}