2011-11-14 49 views
9

我有一个自托管的WCF服务作为使用WebAPI处理REST内容的Windows服务运行,并且工作效果很好。如何从WCF WebAPI返回原始HTML WebGet

我意识到我应该真的使用IIS或类似的菜来出实际的网页,但有没有办法得到服务调用返回“只是”HTML?

即使我指定“BodyStye裸”,我还是得到各地实际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"); 
} 

有没有办法做到这一点,或者我应该放弃?

回答

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类很容易。

而且,self-host选项与使用IIS一样可以返回静态HTML。在封面下,他们使用相同的HTTP.sys内核模式驱动程序来传递位。

+3

感谢堆,这足够接近让我在那里,我只需要改变一行“response.Content.Headers.ContentType = new MediaTypeHeaderValue(”text/html“); ” – Swordblaster

4

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

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

在你的情况下,格式化程序不需要格式化任何东西,只是返回你的返回值,因为你已经返回格式化的html。