Каков наилучший / наиболее гибкий способ сделать вывод WCF XHTML? - PullRequest
2 голосов
/ 17 февраля 2009

Каков наилучший / наиболее гибкий способ получения вывода WCF XHTML? Если для вывода XHTML нет «Пути WCF» (tm) - есть ли какие-нибудь общие инструменты для этого? Или мне нужно накатить свою?

Ответы [ 3 ]

2 голосов
/ 18 февраля 2009

WCF занимается передачей данных. Это позволяет вам настроить сервисный контракт для клиента / хоста, через который можно общаться. Он абстрагирует ваш транспорт, так что вы можете легко настроить свой сервис, будь то через HTTP / TCP / NamedPipes / Tibco EMS / все, что вы хотите. По моему опыту, сообщения по сети все по умолчанию сериализуются в SOAP, но это, безусловно, также можно настраивать. XHTML - это презентация (да, вы можете утверждать, что CSS - это настоящая презентация, а XHTML - это ваше представление данных). В основном вы хотите вернуть свои данные таким образом, чтобы, среди прочего, они могли быть представлены в веб-браузере.

Причина, по которой это не имеет смысла для меня, заключается в том, что вы, похоже, пытаетесь разместить службу WCF там, где должен находиться веб-сервер.

Но давайте посмотрим, как это можно сделать:

Хотите ли вы, чтобы инфраструктура WCF фактически форматировала сообщение как XHTML по сети? Если это так, и вы хотите отправлять запросы в стиле REST в службу, начните с WCF REST Starter Kit .

Основная проблема - сериализация. Я знаю, что WCF в .Net 3.5 SP1 позволяет запускать WCF с JsonDataContractSerializer вместо стандартного DataContractSerializer, который сериализует объекты в XML. Вы можете написать свой собственный XHTMLDataContractSerializer. Тем не менее, полученный XHTML будет в значительной степени вашим собственным. Вот ветка, с которой можно начать.

РЕДАКТИРОВАТЬ: Только что нашел это . Я думаю, что это определенно вариант. И это кажется довольно простым для реализации.

1 голос
/ 18 февраля 2009

Я не верю, что существует "официальный" способ WCF вернуть XHTML, начиная с .NET 3.5 SP1. Аарон Лерч предложил, чтобы WCF применил таблицу стилей XSLT по умолчанию в июле 2007 года , но что-то подобное еще не было принято командой WCF.

Как отмечалось в других ответах, вы можете развернуть свою собственную поддержку XHTML, используя образцы из WCF Starter Kit или используя необработанную модель программирования, описанную Карлосом Фигейрой . Некоторые из примеров кода WCF , предоставленные онлайн Мишель Леру Бустаманте как часть ее книги Learning WCF , полезны, если вы решите сделать это самостоятельно.

Мы возвращаем XHTML, а также JSON и XML из нашего веб-сервиса на основе WCF. Хотя я не уверен, что наш подход - лучший , он работает.

Наш подход - использовать DataContractSerializer для генерации XML, затем применить преобразование Complied XSLT и вернуть поток результатов, который теперь должен содержать XHTML. Вот упрощенная версия нашего кода:

public Stream GetItemAsHtml(string id) {
    Item obj = GetItem(objectId);
    Stream xml = GetXmlStream(obj);    
    return TransformXmlStream(xml, defaultTransform);
}        

public static Stream GetXmlStream(IXmlSerializable item) {
    MemoryStream stream = new MemoryStream();
    using (XmlWriter writer = XmlWriter.Create(stream, new XmlWriterSettings { Encoding = Encoding.UTF8 })) {
        if (writer != null) {
            DataContractSerializer dcs = new DataContractSerializer(item.GetType());
            dcs.WriteObject(writer, item);

            writer.Flush();
            writer.Close();
        }
    }
    stream.Seek(0, SeekOrigin.Begin);
    return stream;
}

public static Stream TransformXmlStream(Stream xml, string xsltFile) {
    XmlReader reader = XmlReader.Create(xml);

    XslCompiledTransform trans = new XslCompiledTransform();
    trans.Load(xsltFile);

    MemoryStream stream = new MemoryStream();
    using (XmlWriter writer = XmlWriter.Create(stream, trans.OutputSettings)) {
        if (writer != null) {
            trans.Transform(reader, writer);

            writer.Flush();
            writer.Close();
        }
    }
    stream.Seek(0, SeekOrigin.Begin);
    return stream;
}

Это делает свою работу, но я не думаю, что это сценарий, которого ожидали дизайнеры WCF. :-)

1 голос
/ 18 февраля 2009

WCF является компонентной технологией - вы пишете интерфейсы и их реализации, а затем инструктируете WCF, как обращаться с безопасностью, транспортировкой и т. Д.

Возврат XHTML из компонента WCF будет таким же, как и возврат WCF из любого другого компонента .NET - возможно, в виде строки. Пока вы можете возвращать данные из вашего компонента в базовых типах или через действующие контракты на передачу данных, вы должны быть крутыми.

Возможно, вы захотите проверить главу 3 в Программировании служб WCF Джувала Лоуи - все о контрактах на данные и о том, что вы можете выплюнуть из своих компонентов. Возможно, вы ищете какой-то удобный способ десериализации данных после того, как клиент получит что-то от вашего компонента ... Если это так, Лоуи покажет вам, как.

Итак, краткий ответ - вернуть XHTML из вашего компонента, как вам угодно. Насколько я знаю, нет особого способа испускать XHTML из компонента WCF.

...