如何在WCF REST中创建XML响应

时间:2016-05-12 12:55:05

标签: xml wcf rest

我想制作这个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语法。

1 个答案:

答案 0 :(得分:0)

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