【问题标题】:Define WCF XML response schema定义 WCF XML 响应架构
【发布时间】:2011-12-15 20:27:36
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: wcf web-services xsd


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 2023-03-10
      相关资源
      最近更新 更多