2013-05-16 75 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