2016-05-12 58 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(); 
    } 
}