WCF服务器返回带有?XML样式表集的XML文档

WCF服务器返回带有?XML样式表集的XML文档,wcf,serialization,Wcf,Serialization,我正在创建一个REST web服务,它通过使用DataContractSerializer序列化.NET对象来返回XML文档。它可以很好地返回以下文档: <?xml version="1.0" encoding="utf8" ?> <patient xmlns="http://stackoverflow.com/example"> ..... </patient> ..... 通过使用如下代码: Message MyRestMethod() {

我正在创建一个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;
}
<?xml version="1.0" encoding="utf8" ?>
<?xml-stylesheet type="text/xsl" href="/stylesheet/format.xsl" ?>
<patient xmlns="http://stackoverflow.com/example">
    .....
</patient>
消息MyRestMethod()
{
Patient patientObject=new Patient(){Name=“米老鼠”};
Message Message=WebOperationContext.Current.CreateXmlResponse(patientObject);
返回消息;
}
但是,有时web服务由web浏览器使用,因此如果它返回如下文档会更好:

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样式表指令

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


如果有人有更好的建议,请让我知道…

在这种情况下,您很可能会这样做,因为xml声明是由message encoder添加的,它不提供任何功能来添加任何其他指令。

对此有一些实质性的阅读,答案是,在返回给WCF客户机的xml中添加xml样式表标记是不明智的

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


然而,对于我的用例,当xml返回到浏览器时,将样式表处理指令放在其中是有意义的,因此我通过基于请求中的UserAgent进行条件序列化来解决我的问题,如果它不是WCF客户端应用程序,我正在将样式表添加到用于创建响应消息的流中。

我避免了自定义消息编码器路由,因为我的ServiceContract返回消息而不是特定对象。这样,客户机代码就可以完全访问消息头,这在REST接口中非常重要……即使使用数据契约,您也可以始终访问消息头。