【问题标题】:How to create a XML response in WCF REST如何在 WCF REST 中创建 XML 响应
【发布时间】:2016-05-12 12:55:05
【问题描述】:

我想生成这个 XML:

<data contentType="text/plain" contentLength="24">
    <![CDATA[OK - 12/05/2016 14:45:40]]>
</data>

我的程序运行良好,但我觉得必须有另一种方法来生成这个 XML。

[WebInvoke(Method = "GET", 
           ResponseFormat = WebMessageFormat.Xml, 
           BodyStyle = WebMessageBodyStyle.Bare, 
           RequestFormat = WebMessageFormat.Xml, 
           UriTemplate = "ping")]
Stream PingServer();

public Stream PingServer()
{
    string LeUrl = "http://yyyyy.fr/Service1.svc";
    string Result = "";

    try
    {
        var myRequest = (HttpWebRequest)WebRequest.Create(LeUrl);

        var response = (HttpWebResponse)myRequest.GetResponse();

        if (response.StatusCode == HttpStatusCode.OK)
        {
            //  it's at least in some way responsive
            //  but may be internally broken
            //  as you could find out if you called one of the methods for real
            //Debug.Write(string.Format("{0} Available", url));

            Result = "OKE --" + DateTime.Now ;
        }
        else
        {
            //  well, at least it returned...
            //Debug.Write(string.Format("{0} Returned, but with status: {1}", url, response.StatusDescription));
            Result = response.StatusDescription;
        }
   }
   catch (Exception ex)
   {
       //  not available at all, for some reason
       //Debug.Write(string.Format("{0} unavailable: {1}", url, ex.Message));
       Result = ex.Message;
   }

   WebOperationContext CurrentWebContext = WebOperationContext.Current;
   CurrentWebContext.OutgoingResponse.ContentType = "text/plain";   

   String AnyXml = "<data contentType=\"text/plain\" contentLength=\"24\">"+"><![CDATA[OK - "+DateTime.Now+"]]></data>";

   return new MemoryStream(Encoding.UTF8.GetBytes(AnyXml)); 
}

我想使用XmlElement 或类似的东西。

我不想自己创建 XML 语法。

【问题讨论】:

    标签: xml wcf rest


    【解决方案1】:

    您可以为此使用 XmlSerializer - 使用适当的 System.Xml.Serialization 属性(即 XmlRoot、XmlAttribute...)定义数据类型,并使用 [XmlSerializerFormat] 声明您的操作。

    下面的代码显示了您的场景的可能实现。请注意,它强制使用 CData(这是您在问题中所使用的),但如果您不需要它,则不需要在类中具有额外的属性。

    public class StackOverflow_37187563
    {
        [XmlRoot(ElementName = "data", Namespace = "")]
        public class Data
        {
            [XmlAttribute(AttributeName = "contentType")]
            public string ContentType { get; set; }
            [XmlAttribute(AttributeName = "contentLength")]
            public int ContentLength { get; set; }
            [XmlElement]
            public XmlCDataSection MyCData
            {
                get { return new XmlDocument().CreateCDataSection(this.Value); }
                set { this.Value = value.Value; }
            }
            [XmlIgnore]
            public string Value { get; set; }
        }
    
        [ServiceContract]
        public class MyService
        {
            [WebGet(ResponseFormat = WebMessageFormat.Xml), XmlSerializerFormat]
            public Data PingServer()
            {
                return new Data
                {
                    ContentLength = 24,
                    ContentType = "text/plain",
                    Value = "OK - 12/05/2016 14:45:40"
                };
            }
        }
    
        public static void Test()
        {
            string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
            WebServiceHost host = new WebServiceHost(typeof(MyService), new Uri(baseAddress));
            host.Open();
            Console.WriteLine("Host opened");
    
            WebClient c = new WebClient();
            Console.WriteLine(c.DownloadString(baseAddress + "/PingServer"));
    
            Console.Write("Press ENTER to close the host");
            Console.ReadLine();
            host.Close();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多