11

在阅读这篇关于如何使用. IHttpActionResult_ IHttpActionResult_ApiControllerAccept

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

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

如果请求指定了Accept: text/html,则IHttpActionResult应该使用它来返回 HTML。那可能吗?此外,我们将不胜感激有关此内容协商管道如何适用于 json 或 xml(具有内置支持)的一些见解。

4

1 回答 1

13

如果我们IHttpActionResult暂时搁置讨论,Web API 中的内容协商过程是通过格式化程序驱动的。因此,您需要创建一个新的格式化程序来处理媒体类型text/html

Web API 公开了它用于内容协商的默认算法,称为DefaultContentNegotiator服务的实现IContentNegotiator

现在,这种协商算法可以由 Web API 自动为您运行,例如在以下情况下:

用法#1

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

或者

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

用法#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<>是生成 type 实例的快捷方法 OkNegotiatedContentResult<>

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

问题是这种OkNegotiatedContentResult<>类型的行为与上面的用法#2场景类似。即他们在内部运行谈判者。

总而言之,如果您打算支持text/html媒体类型,那么您需要编写一个自定义格式化程序并将其添加到 Web API 的格式化程序集合中,然后当您使用Ok<string>("Hello")Accept 标头时text/html,您应该会在text/html. 希望这可以帮助。

于 2014-01-31T01:38:10.743 回答