2009-06-01 65 views
10

如何定義[OperationContract] [WebGet]方法來返回存儲在字符串中的XML,而不使用HTML編碼字符串?如何在WCF中爲[WebGet]方法發佈裸露的XML?

應用程序正在使用WCF服務來返回已存儲爲字符串的XML/XHTML內容。 XML不通過[DataContract]與任何特定的類相對應。它意味着被XSLT使用。

[OperationContract] 
[WebGet] 
public XmlContent GetContent() 
{ 
    return new XmlContent("<p>given content</p>"); 
} 

我有這個類:

[XmlRoot] 
public class XmlContent : IXmlSerializable 
{ 
    public XmlContent(string content) 
    { 
     this.Content = content; 
    } 
    public string Content { get; set; } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     throw new NotImplementedException(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 

     writer.WriteRaw(this.Content); 
    } 
    #endregion 
} 

但是連載的時候,有一個根標籤的包裹給定的內容。

<XmlContent> 
    <p>given content</p> 
</XmlContent> 

我知道如何改變根標籤([XmlRoot(的ElementName =「格」)])的名字,但我需要省略根標籤,如果在所有可能的。

我也試過[DataContract]而不是IXmlSerializable,但它似乎不太靈活。

回答

8

返回一個XmlElement。你不需要IXmlSerializable。你不需要包裝類。

例如服務接口:

namespace Cheeso.Samples.Webservices._2009Jun01 
{ 
    [ServiceContract(Namespace="urn:Cheeso.Samples.Webservices")] 
    public interface IWebGetService 
    { 
     [OperationContract] 
     [WebGet(
       BodyStyle = WebMessageBodyStyle.Bare, 
        RequestFormat = WebMessageFormat.Xml, 
        ResponseFormat = WebMessageFormat.Xml, 
        UriTemplate = "/Greet/{greeting}")] 
     XmlElement Greet(String greeting); 
    } 
} 

服務實現:

namespace Cheeso.Samples.Webservices._2009Jun01 
{ 
    [ServiceBehavior(Name="WcfWebGetService", 
        Namespace="urn:Cheeso.Samples.WebServices", 
        IncludeExceptionDetailInFaults=true)] 

    public class WcfWebGetService : IWebGetService 
    { 
     public XmlElement Greet (String greeting) 
     { 
      string rawXml = "<p>Stuff here</p>"; 
      XmlDocument doc = new XmlDocument(); 
      doc.Load(new System.IO.StringReader(rawXml)); 
      return doc.DocumentElement; 
     } 
    } 
} 

也看,這類似的問題,但沒有WebGet扭曲:
serializing-generic-xml-data-across-wcf-web-service-requests

+0

謝謝!這是有效的,但是對XML進行反序列化並重新序列化它有缺點。效率不如我想,但至少它消除了根標籤。感謝您的選擇。 – 2009-06-01 20:47:12