2014-01-30 78 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