简体   繁体   中英

How to create a XML response in WCF REST

I want to produce this XML:

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

my program works well, but I feel there must be another way to produce this 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)); 
}

I think use XmlElement or something like that.

I don't want to create the XML syntax myself.

You can use the XmlSerializer for that - define the data type with the proper System.Xml.Serialization attributes (ie, XmlRoot, XmlAttribute, ...), and declare your operation with [XmlSerializerFormat] .

The code below shows a possible implementation for your scenario. Notice that it forces the use of CData (which is what you had in the question), but if you don't need it, you don't need to have the extra property in the class.

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();
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM