2011-01-21 1 views
1

У меня есть служба обслуживания wcf, которая возвращает xml. У меня возникла идея добавить в xml инструкцию обработки xsl-преобразования, чтобы очистить данные при просмотре через веб-браузер.Могу ли я добавить инструкцию обработки xml-преобразования в xml, возвращенный из договора службы wcf

Миссия Цель # 1: add <?xml-stylesheet type="text/xsl" href="style.xsl"?> to returned xml

Я попробовал следующий метод; http://shevaspace.blogspot.com/2009/01/include-xml-declaration-in-wcf-restful.html Рекомендуемый способ добавления тега xml-stylesheet в документы XML выглядит как метод WriteProcessingInstruction, но System.Xml.XmlDictionaryWriter не разрешает никаких вызовов WriteProcessingInstruction(string name, string text) с параметром имени anythin кроме "xml". WriteRaw также не допускается, поскольку он может записывать данные только в корневом узле xml.

Есть ли способ привязать тег xml-stylesheet к возвращенному xml из службы wcf?

ответ

2

Я достиг этого, выполнив свой собственный XmlWriter, который записывает инструкцию обработки. (В моем случае, только для ответов в отдельных пространствах имен):

public class StylesheetXmlTextWriter : XmlTextWriter 
{ 
    private readonly string _filename; 
    private readonly string[] _namespaces; 
    private bool firstElement = true; 

    public StylesheetXmlTextWriter(Stream stream, Encoding encoding, string filename, params string[] namespaces) : base(stream, encoding) 
    { 
     _filename = filename; 
     _namespaces = namespaces; 
    } 

    public override void WriteStartElement(string prefix, string localName, string ns) 
    { 
     if (firstElement && (_namespaces.Length == 0 || _namespaces.Contains(ns))) 
      WriteProcessingInstruction("xml-stylesheet", string.Format("type=\"text/xsl\" href=\"{0}\"", _filename)); 

     base.WriteStartElement(prefix, localName, ns); 
     firstElement = false; 
    } 
} 

Конечно, в типичной WCF моды самая трудная часть упражнения, чтобы получить WCF, чтобы использовать это. Для меня это участие:

  • Реализация пользовательского WebServiceHost и WebServiceHostFactory
  • Замена WebMessageEncodingBindingElement из ServiceEndpoints с настраиваемой MessageEncodingBindingElement
  • Переопределение MessageEncodingBindingElement.CreateMessageEncoderFactory вернуть пользовательский MessageEncoderFactory
  • Реализация пользовательских MessageEncoderFactory , который возвращает пользовательский MessageEncoder в свойстве Encoder
  • Реализация специального MessageEncoder, который использует таблицу стилей XmlTextWriter в своих реализациях WriteMessage
+0

Отличная реализация, немного дополнительная работа над надменной частью, но стоит конечного результата. –

Смежные вопросы