2014-01-30 88 views
11

如何使用IHttpActionResult的Web API 2返回HTML閱讀this blog post後,我想以某種方式「線式」這一IHttpActionResultApiController基於一個與請求中的Accept頭。內容協商返回HTML

具有類似的簽名本定的控制器操作:

public MyObject Get(int id) 
{ 
    return new MyObject(); 
} 

如果請求指定Accept: text/html,這IHttpActionResult應該用於返回HTML。那可能嗎?此外,在這個內容協商流水線工作JSON或XML(已內置支持)一些有識之士將不勝感激。

+1

問問自己會有什麼** **你希望得到從這個動作的HTML響應?跨度,divs,標籤,表格?使用json和xml時,由於它們的性質,它或多或少是可預測的,很難爲HTML提供一些通用的東西。您應該手動生成它,並將其與正確的響應標題一起返回。 – Ramunas

+0

我會用RazorEngine渲染對象的看法,我不是在尋找一個防彈「通用」的解決方案。所以它會爲每個返回類型手動生成。 – cvbarros

+0

WebAPI with Razor?看起來像一個正常的ASP.NET MVC – Ramunas

回答

13

如果我們保持IHttpActionResult討論往旁邊一momment,在網頁API內容協商過程是通過格式化驅動。所以,你需要創建一個新的格式化處理的介質類型text/html

Web API公開了它用於內容協商的默認算法DefaultContentNegotiator,該算法是服務IContentNegotiator的實現。

使用#1

public MyObject Get(int id) 
{ 
    return new MyObject(); 
} 

OR

您可以手動運行

現在這個協商算法既可以通過網絡API自動爲您在下列情況下,像運行協商喜歡自己在以下情況:

用法#2

public HttpResponseMessage Get() 
{ 
    HttpResponseMessage response = new HttpResponseMessage(); 

    IContentNegotiator defaultNegotiator = this.Configuration.Services.GetContentNegotiator(); 
    ContentNegotiationResult negotationResult = defaultNegotiator.Negotiate(typeof(string), this.Request, this.Configuration.Formatters); 

    response.Content = new ObjectContent<string>("Hello", negotationResult.Formatter, negotationResult.MediaType); 
    return response; 
} 

關於IHttpActionResults
在以下方案中,Ok<>是用於產生 OkNegotiatedContentResult<>類型的實例的快捷方法。

public IHttpActionResult Get() 
{ 
    return Ok<string>("Hello"); 
} 

事情是這樣OkNegotiatedContentResult<>類型做類似的事情在使用上述第2場景。即他們在內部經營談判者。

因此得出結論,如果你打算支持text/html媒體類型,那麼你需要編寫自定義格式,並把它添加到網頁API的格式集合,然後當你使用Ok<string>("Hello")text/html的接受頭,你應該看到響應在text/html。希望這可以幫助。

+0

謝謝,基蘭。我最終將使用#1與WebApiContrib.Formatting.Razor項目結合使用,該項目具有用於Razor的內置ViewLocator和媒體類型格式化程序。感謝您的幫助!https://github.com/WebApiContrib/WebApiContrib.Formatting.Razor – cvbarros