2016-05-12 97 views
1

創建一個XML響應我要產生這種XML:如何在WCF REST

<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語法。

回答

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