2013-05-16 82 views
3

我放在一起在WCF一個簡單的REST服務爲這樣:WCF REST SVC GET返回HTML

.... 
[OperationContract] 
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml, UriTemplate = "{uid}/{pwd}/{exrcsPrgmId}/{exchEnum}")] 
string GetLiftDataExchange(string uid, string pwd, string exrcsPrgmId, string exchEnum); 
.... 

當調用它,但是我不回來正好XML。我得到HTXML(我自己由首字母縮寫)

而不是我所期望的:

<Exercise> 
    <AccountName>Joe Muscle</AccountName> 
    <UserID>8008008</UserID> 

我與HTML編碼XML:

&lt;Exercise&gt;&#xD; 
    &lt;AccountName&gt;John Bonner&lt;/AccountName&gt;&#xD; 
    &lt;UserID&gt;8008008&lt;/UserID&gt;&#xD; 

換句話說,我也沒有必要在瀏覽器中查看這些數據,而不是在應用程序中訪問和分析它,這樣直線上的XML就可以正常工作。

我在做什麼錯誤的服務裝飾品返回此編碼的XML?

回答

10

當您返回一個string,並且結果類型爲XML時,您將得到的字符串編碼爲能夠表示字符串中的所有字符 - 這會導致XML字符被轉義。

對於您的方案,您有兩種選擇。如果您想要返回「純」XML(即XHTML或HTML,它恰好是格式良好的XML),則可以使用返回類型XmlElementXElement。這是告訴WCF你確實想要返回任意的XML。如果你喜歡下面的代碼,你會得到你需要的「純粹」的XML。

[OperationContract] 
[WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "...")] 
public XElement GetLiftDataExchange(string uid, string pwd, string exrcsPrgmId, string exchEnum) 
{ 
    return XElement.Parse(@"<Exercise> 
      <AccountName>Joe Muscle</AccountName> 
      <UserID>8008008</UserID> 
     </Exercise>"); 
} 

另一種方法是返回一個Stream - 這意味着你控制輸出(見this blog post有詳細介紹),你的代碼看起來像下面的一個。這種方法的優點是您的HTML不需要格式良好的XML(即,您可以擁有諸如<br><hr>這些有效的HTML但無效的XML)。

[OperationContract] 
[WebGet(UriTemplate = "...")] 
public Stream GetLiftDataExchange(string uid, string pwd, string exrcsPrgmId, string exchEnum) 
{ 
    var str = @"<html><head><title>This is my page</title></head> 
      <body><h1>Exercise</h1><ul> 
      <li><b>AccountName</b>: Joe Muscle</li> 
      <li><b>UserID</b>: 8008008</li></body></html>"; 
    WebOperationContext.Current.OutgoingResponse.ContentType = "text/html"; 
    return new MemoryStream(Encoding.UTF8.GetBytes(str)); 
} 

在關聯的節點,請不要使用[WebInvoke(Method="GET")],使用[WebGet]代替。

+0

更新了裝飾。謝謝你的提示。 – GPGVM