我在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:
<Exercise>
<AccountName>John Bonner</AccountName>
<UserID>8008008</UserID>
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]改用.
| 归档时间: |
|
| 查看次数: |
2660 次 |
| 最近记录: |