wcf - 定义 WCF XML 响应架构

标签 wcf web-services xsd

我构建了一个 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>

服务接口(interface):

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

我应该怎么做才能定义服务响应模式以使其像这样?

谢谢。

最佳答案

您可以使用 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();
    }
}

关于wcf - 定义 WCF XML 响应架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7905186/

相关文章:

c# - 如何使用异步调用 WCF 关闭客户端代理

android - KSoap soapEnvelope bodyIn 和 getResponse() 问题

c# - 计算 Web 服务下载的吞吐量

java - 为多个 Web 服务请求保持连接打开

xsd - XML 模式中的 minOccurs/maxOccurs

java - JAXB 从 xsd 文件生成的类

wcf - 我是否正确设计了这个 WCF RESTful 接口(interface)?

c# - 通过 DTD 实体引用外部 xml 文件

Java:从 .xml 文件填充 .xsd 生成的类

c# - WCF 服务为每个新请求创建一个新线程