我在WCF中整理了一个简单的REST服务:
....
[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:
<Exercise>
<AccountName>John Bonner</AccountName>
<UserID>8008008</UserID>
换句话说,我不需要在浏览器中看到这些数据,而是在应用程序中访问和解析它,所以直接使用XML就可以了。
我在服务装饰上做错了什么来返回这个编码的xml?
答案 0 :(得分:11)
当您返回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>");
}
另一种方法是返回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]
。