2011-11-14 48 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。