问题 内容协商返回HTML


看完之后 这篇博文 关于如何从中返回HTML Web API 2 运用 IHttpActionResult,我想以某种方式“连线”这个 IHttpActionResult 对我的 ApiController 基于 Accept 随请求发送的标头。

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

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

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


9272
2018-01-30 21:51


起源

只要问自己会是什么 您 期望通过此操作获得HTML响应?跨度,div,标签,表?虽然使用json和xml,但由于它们的性质,它或多或少是可预测的,因此很难为HTML提供通用的东西。您应该手动生成它并将其与正确的响应标头一起返回。 - Ramunas
我将使用RazorEngine在视图中渲染对象,我不是在寻找防弹“通用”解决方案。因此,将为每种返回类型手动生成它。 - cvbarros
使用Razor的WebAPI?看起来像一个普通的ASP.NET MVC - Ramunas


答案:


如果我们继续讨论 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<> 是生成类型实例的快捷方法 OkNegotiatedContentResult<>

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

事情是这样的 OkNegotiatedContentResult<> 类型与...类似 用法#2 上面的场景。他们在内部经营谈判代表。

总而言之,如果你打算支持 text/html 然后,您需要编写自定义格式化程序并将其添加到Web API的格式化程序集合中,然后再使用 Ok<string>("Hello") 使用Accept标头 text/html,你应该看到响应 text/html。希望这可以帮助。


13
2018-01-31 01:38



谢谢,Kiran。我最终使用了#1的WebApiContrib.Formatting.Razor项目,它有一个内置的ViewLocator和Razor的媒体类型格式化程序。谢谢你的帮助!github.com/WebApiContrib/WebApiContrib.Formatting.Razor - cvbarros