9

我有一个自托管的 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");
}

有什么办法可以做到这一点还是我应该放弃?

4

2 回答 2

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 内核模式驱动程序来传递位。

于 2011-11-14T13:37:25.817 回答
4

您必须使用接受“text/html”作为内容类型的格式化程序,并在请求标头中请求内容类型“text/html”。

如果您不添加处理 text/html 的格式化程序,Web API 默认会回退到 XML 格式化程序。

在您的情况下,格式化程序不需要格式化任何内容,只需返回您的返回值,因为您已经返回格式化的 html。

于 2011-11-14T08:56:02.410 回答