内容协商返回HTML

时间:2014-01-30 21:51:08

标签: c# html asp.net-web-api content-negotiation

在阅读了this blog post关于如何使用IHttpActionResult Web API 2 返回HTML之后,我想以某种方式将此IHttpActionResult“连接”到我的ApiController Accept基于随请求发送的public MyObject Get(int id) { return new MyObject(); } 标头。

给定具有与此类似的签名的控制器操作:

Accept: text/html

如果请求指定IHttpActionResult,则应使用此{{1}}返回HTML。那可能吗?此外,对于这个内容协商管道如何为json或xml(具有内置支持)工作的一些见解将不胜感激。

1 个答案:

答案 0 :(得分:13)

如果我们继续讨论IHttpActionResult的问题,那么Web API中的内容协商过程是通过格式化程序来实现的。因此,您需要创建一个新的格式化程序来处理媒体类型text/html

Web API公开了它用于名为DefaultContentNegotiator的内容协商的默认算法,这是服务IContentNegotiator的一种实现。

现在,在以下情况下,您可以自动为Web协议运行此协商算法:

用法#1

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

OR

您可以自行运行协商,如下所示:

用法#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媒体类型,那么您需要编写自定义格式化程序并将其添加到Web API的格式化程序集合中,然后在使用Ok<string>("Hello")时使用Accept标头text/html,您应该会在text/html中看到回复。希望这会有所帮助。