2011-09-17 83 views
2

我正在創建一個REST Web服務,該服務通過使用DataContractSerializer序列化.NET對象來返回XML文檔。通過使用這樣的代碼WCF服務器返回帶有?xml-stylesheet的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服務所使用的網絡瀏覽器,所以這將是,如果它更漂亮將返回文件是這樣的:

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

我已經做了一些實質性的周圍挖掘,並能幾乎通過推導我自己的消息和OV做使用OnWriteBodyContents()來訪問XmlDictionaryWriter。此時,我發現WriteProcessingInstruction(name,text)不能寫入xml-stylesheet指令。

更重要的是,接收xml樣式表處理指令的WCF客戶端代碼也會彈出,所以即使您在角色級別「劈開」流以添加它,也不需要將其發送到WCF客戶端。 。

如果任何人有更好的建議,請讓我知道...

回答

1

在圓頂上有一些大量的讀物,答案是在返回給WCF客戶端的XML中添加一個XML樣式表標記是不明智的。

標記是處理指令,它指示解釋器以某種方式處理XML文檔。在這種特殊情況下,通過將XSLT應用於文檔。 WCF序列化和反序列化器都會拒絕帶有樣式表處理指令的XML,這很有意義 - 正如WCF客戶端中的情況一樣,您不希望遵循處理指令。

但是,對於我的用例,將xml返回給瀏覽器時使用樣式表處理指令確實很有意義,所以我通過在請求中基於UserAgent執行條件序列化來解決我的問題,並且在它不是WCF客戶端應用程序,我將樣式表添加到用於創建響應消息的流中。

0

在這種情況下,你最可能將到custom message encoder因爲XML聲明是由信息編碼器且將其不提供任何功能添加任何其他指令。

+0

我已經避免了自定義消息編碼器路由,因爲我的ServiceContract返回消息而不是特定的對象。這樣,客戶端代碼就可以完全訪問消息頭,這在REST接口中相當重要。 –

+0

即使使用數據協定,您也總是可以訪問消息頭。 –