【问题标题】:WCF server returning XML documents with ?xml-stylesheet setWCF 服务器返回带有 ?xml-stylesheet 集的 XML 文档
【发布时间】:2011-10-05 04:34:52
【问题描述】:

我正在创建一个 REST Web 服务,该服务通过使用 DataContractSerializer 序列化 .NET 对象来返回 XML 文档。它可以很好地返回文档,例如:

<?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;
}

但有时,Web 服务由 Web 浏览器使用,因此如果它返回这样的文档会更好:

<?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(name, text) 无法编写 xml-stylesheet 指令。

更重要的是,接收 xml-stylesheet 处理指令的 WCF 客户端代码也会爆炸,因此即使您在字符级别“破解”流以添加它,也不需要将其发送到 WCF 客户端...

如果有人有更好的建议,请告诉我...

【问题讨论】:

    标签: wcf serialization


    【解决方案1】:

    对此进行了大量阅读,答案是在返回给 WCF 客户端的 XML 中添加 xml 样式表标记是不明智的。

    标记是处理指令,指示解释器以某种方式处理 XML 文档。在这种特殊情况下,通过将 XSLT 应用于文档。 WCF 序列化和反序列化器都拒绝带有样式表处理指令的 XML,这是有道理的 - 在 WCF 客户端案例中,您不希望遵循处理指令。

    但是,对于我的用例,在将 xml 返回到浏览器时使用样式表处理指令确实有意义,因此我通过基于请求中的 UserAgent 进行条件序列化解决了我的问题,在这种情况下它不是 WCF 客户端应用程序,我将样式表添加到用于创建响应消息的流中。

    【讨论】:

      【解决方案2】:

      在这种情况下,你很可能会去custom message encoder,因为 xml 声明是由消息编码器添加的,它不提供任何功能来添加任何其他指令。

      【讨论】:

      • 我避免了自定义消息编码器路由,因为我的 ServiceContract 返回消息而不是特定对象。这样客户端代码就可以完全访问消息头,这在 REST 接口中非常重要...
      • 即使您使用数据合同,您也始终可以访问消息头。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      相关资源
      最近更新 更多