【问题标题】:What is the best / most flexible way to have WCF output XHTML?让 WCF 输出 XHTML 的最佳/最灵活的方法是什么?
【发布时间】:2009-02-17 20:12:27
【问题描述】:

让 WCF 输出 XHTML 的最佳/最灵活的方式是什么?如果没有“WCF 方式”(tm) 来进行 XHTML 输出 - 是否有任何通用工具可供使用?还是我需要自己动手?

【问题讨论】:

  • 我可能遗漏了一些东西,但它们在很大程度上不是正交的吗? wcf 是运输和合同; xhtml 是演示文稿。当然,你可以返回一个字符串....但是呢?
  • 我的印象是有一些“wcf方式”可以做到这一点......如果不是 - 那也很好......将把它编辑成问题...... :)
  • 怎么回事?你想解释一下我想要完成的事情吗?您知道 XHTML 是什么吗? WCF?

标签: .net wcf web-services rest


【解决方案1】:

WCF 关注数据的传输。它允许您为客户端/主机设置服务合同以进行对话。它抽象了您的传输,以便您可以轻松地配置您的服务,无论是通过 HTTP/TCP/NamedPipes/Tibco EMS/任何您想要的。根据我的经验,通过网络传输的消息本身都默认序列化为 SOAP,但这当然也是可配置的。 XHTML 是表示(是的,您可以说 CSS 是真正的表示,而 XHTML 是您的数据表示)。您基本上希望以一种可以通过网络浏览器呈现的方式返回您的数据。

这对我来说没有意义的原因是您似乎试图将 WCF 服务放置在 Web 服务器所属的位置。

但是让我们看看它是如何做到的:

您是否希望 WCF 基础结构通过网络将消息实际格式化为 XHTML?如果是这样并且您想向服务发送 REST 样式的请求,请从 WCF REST Starter Kit 开始。

主要挑战是序列化。我知道 .Net 3.5 SP1 中的 WCF 允许使用 JsonDataContractSerializer 运行 WCF,而不是使用将对象序列化为 XML 的标准 DataContractSerializer。您可以编写自己的 XHTMLDataContractSerializer。但是,生成的 XHTML 将是您自己的。 Here's 一个让你开始的话题。

编辑:刚刚找到this。我认为这绝对是一个选择。而且它似乎很容易实现。

【讨论】:

  • 是的 - 我想我可能有一个错误的假设,即有办法做到这一点。该假设是基于这样一个事实,即有一种明确的方式来发出 xml 和 json。看起来 XHTML 将是一个自然的选择。感谢您的附加信息。
  • 嗯,有一个明确的方法,这是可能的。这只是一个痛苦的过程。 :)
【解决方案2】:

从 .NET 3.5 SP1 开始,我认为没有“官方”WCF 方式返回 XHTML。 Aaron Lerch suggested having WCF apply a default XSLT stylesheet in July 2007,但 WCF 团队尚未采用类似的方法。

正如其他答案所述,您可以使用来自WCF Starter Kit 的示例或使用raw programming model described by Carlos Figueira 推出自己的XHTML 支持。 Michele Leroux Bustamante 在线提供的一些WCF sample code 作为她的Learning WCF 书籍的一部分,如果您决定自己动手,将会很有帮助。

我们从基于 WCF 的 Web 服务返回 XHTML 以及 JSON 和 XML。虽然我不确定我们的方法是否是最佳方法,但它确实有效。

我们的方法是使用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 的设计者所预期的场景。 :-)

【讨论】:

  • 我也这样做了。当然正确的方法是设置一个 ASP.Net 站点来将 wcf 服务中的数据呈现为 HTML,但有时您只需要一种快速而肮脏的方法来以可读格式显示数据。
【解决方案3】:

WCF 是一种组件技术 - 您编写接口及其实现,然后指示 WCF 如何处理安全、传输等。

从 WCF 组件返回 XHTML 与从任何其他 .NET 组件返回 WCF 相同 - 可能作为字符串。只要您可以以基本类型或通过有效的数据协定从组件返回数据,您就应该很酷。

您可能想查看 Juval Lowy 编写的 WCF 服务编程的第 3 章 - 全部是关于数据契约以及您可以从组件中输出的所有内容。也许您正在寻找一种简洁的方法来在客户端从您的组件中取回某些内容后反序列化数据......如果是这样,Lowy 将向您展示如何。

所以,简短的回答是从您的组件中返回 XHTML,但您愿意。据我所知,没有从 WCF 组件发出 XHTML 的特殊方法。

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 2013-04-21
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多