WCF REST Svc GET返回HTML

GPG*_*GVM 3 wcf wcf-rest

我在WCF中组装了一个简单的REST服务:

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

在调用它时,我并没有完全恢复XML.我得到了HTXML(我自己编写的缩写词)

而不是我期望的:

<Exercise>
  <AccountName>Joe Muscle</AccountName>
  <UserID>8008008</UserID>
Run Code Online (Sandbox Code Playgroud)

我用HTML编码获取XML:

&lt;Exercise&gt;&#xD;
  &lt;AccountName&gt;John Bonner&lt;/AccountName&gt;&#xD;
  &lt;UserID&gt;8008008&lt;/UserID&gt;&#xD;
Run Code Online (Sandbox Code Playgroud)

换句话说,我不需要在浏览器中看到这些数据,而是在应用程序中访问和解析它,所以直接使用XML就可以了.

我在服务装饰上做错了什么来返回这个编码的xml?

car*_*ira 11

当您返回a string,结果类型为XML时,您将获得编码的字符串,以便能够表示字符串中的所有字符 - 这会导致转义XML字符.

您的方案有两种选择.如果要返回"纯"XML(即XHTML,或恰好是格式良好的XML的HTML),可以将返回类型用作XmlElement或者XElement.这告诉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>");
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是返回Stream- 这意味着您可以控制输出(有关详细信息,请参阅此博客文章),您的代码将类似于下面的代码.这种方法的优点是你的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));
}
Run Code Online (Sandbox Code Playgroud)

在相关节点上,请不要使用[WebInvoke(Method="GET")],请[WebGet]改用.