Сервер WCF, возвращающий XML-документы с набором? Xml-stylesheet - PullRequest
2 голосов
/ 17 сентября 2011

Я создаю веб-сервис REST, который возвращает XML-документы путем сериализации объектов .NET с использованием DataContractSerializer. Работает очень хорошо, возвращая документы вроде:

<?xml version="1.0" encoding="utf8" ?>
<patient xmlns="http://stackoverflow.com/example">
    .....
</patient>

используя такой код:

Message MyRestMethod()
{
    Patient patientObject = new Patient() {Name="Mickey Mouse"};
    Message message = WebOperationContext.Current.CreateXmlResponse<Patient>(patientObject);
    return message;
}

Однако иногда веб-сервис используется веб-браузером, и поэтому было бы намного приятнее, если бы он возвращал документы, подобные этому:

<?xml version="1.0" encoding="utf8" ?>
<?xml-stylesheet type="text/xsl" href="/stylesheet/format.xsl" ?>
<patient xmlns="http://stackoverflow.com/example">
    .....
</patient>

Я сделал несколько существенных раскопок и могу почти сделать это, извлекая мое собственное сообщение и перебирая OnWriteBodyContents (), чтобы получить доступ к XmlDictionaryWriter. В этот момент я обнаружил, что WriteProcessingInstruction (имя, текст) не может писать инструкции таблицы XML.

Что еще более важно, клиентский код WCF, получающий инструкцию обработки таблицы стилей xml, также бомбардирует, поэтому даже если вы «взломаете» поток на уровне символов, чтобы добавить его, его не нужно будет отправлять клиентам WCF ...

Если у кого-нибудь есть лучшее предложение, пожалуйста, дайте мне знать ...

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Имея некоторое существенное прочтение по этому вопросу, ответ заключается в том, что не имеет смысла добавлять маркер xml-stylesheet в XML, возвращаемый клиенту WCF.

Маркеры - это инструкции обработки, которые инструктируютинтерпретатор для обработки XML-документа определенным образом.В этом конкретном случае, применяя XSLT к документу.как сериализация, так и десериализация WCF отклоняют XML с инструкциями обработки таблиц стилей, что имеет смысл - как в случае клиента WCF, вы не хотите, чтобы инструкция обработки выполнялась.Инструкция, когда XML возвращается в браузер, имеет смысл, поэтому я решил мою проблему, выполнив условную сериализацию на основе UserAgent в запросе, и в случае, если это не клиентское приложение WCF, я добавляютаблица стилей для потока, который использовался для создания ответного сообщения.

0 голосов
/ 17 сентября 2011

В таком случае вы, скорее всего, перейдете к пользовательскому кодировщику сообщений , поскольку объявление кодировщика xml добавляется кодировщиком сообщений и не предоставляет никаких функций для добавления каких-либо других директив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...