2009-06-01 10 views
10

[OperationContract] [WebGet]メソッドを定義して、文字列に格納されたXMLを返すことができます。WCFの[WebGet]メソッドのための裸のXMLを放出するには?

アプリケーションは、文字列として格納されているXML/XHTMLコンテンツを返すためにWCFサービスを使用しています。 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が=「DIV」)])の名前を変更する方法を知っているが、私はすべての可能性であれば、ルートタグを省略する必要があります。

IXmlSerializableの代わりに[DataContract]を試しましたが、柔軟性が低いようです。

答えて

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

サービスの実装:
serializing-generic-xml-data-across-wcf-web-service-requests

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のねじれのない、また、これと同様の質問を参照してください。

+0

ありがとうございます!それはうまくいくが、XMLをデシリアライズしてからそれを再直列化することの欠点がある。私が望むほど効率的ではありませんが、少なくともルートタグは削除されています。代替のおかげで。 –

+0

元のデータが文字列として格納されている場合は、その複数ステップのプロセスを経なければならないと思います。静的な文字列の場合は、一度だけデセルしてから結果をキャッシュすることができます。最終的なドキュメントの断片を埋めるためのテンプレートであると仮定すると、テンプレートをキャッシュし、各要求ごとに動的ビットを埋め込むことができます。 – Cheeso

+0

この例をモノ2.10.8.1スローで使用する例外タイプ 'System.Xml.XmlElement'に、DataContract属性の名前をnullまたは空の文字列に設定することはできません。 – Tom

関連する問題