Я достиг этого, реализовав свой собственный 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
- Замена элемента WebMessageEncodingBinding элемента ServiceEndpoints пользовательским элементом MessageEncodingBindingElement
- Переопределение MessageEncodingBindingElement.CreateMessageEncoderFactory для возврата пользовательского MessageEncoderFactory
- Реализация пользовательского MessageEncoderFactory, который возвращает пользовательский MessageEncoder в свойстве Encoder
- Реализация пользовательского MessageEncoder, который использует StylesheetXmlTextWriter в своих реализациях WriteMessage