我有一个自托管的WCF服务作为Windows服务运行,使用WebAPI来处理REST的东西,它运行良好。
我意识到我应该真的使用IIS或者类似的方法来制作实际的网页,但有没有办法让服务调用返回“只是”HTML?
即使我指定“BodyStye Bare”,我仍然会获得围绕实际HTML的XML包装器,即
<?xml version="1.0" encoding="UTF-8"?>
<string> html page contents .... </string>
[WebGet(UriTemplate = "/start", BodyStyle = WebMessageBodyStyle.Bare)]
public string StartPage()
{
return System.IO.File.ReadAllText(@"c:\whatever\somefile.htm");
}
有没有办法做到这一点,还是应该放弃?
答案 0 :(得分:16)
bodystyle属性对WCF Web API没有影响。以下示例将起作用。这不一定是做到这一点的最佳方式,但它应该可以正常运作,假设我没有做任何拼写错误: - )。
[WebGet(UriTemplate = "/start")]
public HttpResponseMessage StartPage() {
var response = new HttpResponseMessage();
response.Content = new StringContent(System.IO.File.ReadAllText(@"c:\whatever\somefile.htm"));
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
return response;
}
将文件作为流读取并使用StreamContent而不是StringContent可能更有意义。或者很容易创建自己的FileContent类,接受文件名作为参数。
而且,自托管选项与使用IIS返回静态HTML一样可行。在封面下,他们使用相同的HTTP.sys内核模式驱动程序来传送位。
答案 1 :(得分:4)
您必须使用接受“text / html”作为内容类型的格式化程序,并在请求标头中请求内容类型“text / html”。
如果您不添加处理text / html的格式化程序,则Web API会默认回退到XML格式化程序。
在您的情况下,格式化程序不需要格式化任何内容,只需返回您的返回值,因为您已经返回格式化的HTML。