Как создать голый XML для метода [WebGet] в WCF? - PullRequest
10 голосов
/ 01 июня 2009

Как определить метод [OperationContract] [WebGet] для возврата XML, который хранится в строке, без HTML-кодирования строки?

Приложение использует службу 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 = "div")]), но мне нужно опустить корневой тег, если это возможно.

Я также попробовал [DataContract] вместо IXmlSerializable, но он кажется менее гибким.

1 Ответ

8 голосов
/ 01 июня 2009

Вернуть 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:
сериализация-родовой-XML-данные по-ФОС-веб-сервис-запросы .

...