内容协商以返回HTML

11

阅读了 这篇博客文章,了解了如何使用 IHttpActionResultWeb API 2 返回 HTML。我希望以某种方式将此 IHttpActionResult 与我的 ApiController 相关联,使其基于发送请求时的 Accept 标头来工作。

控制器操作的签名类似于以下内容:

public MyObject Get(int id)
{
    return new MyObject();
}
如果请求中指定了 Accept: text/html,则应使用这个 IHttpActionResult 返回 HTML。是否可能?此外,如果能提供有关如何使用内置支持的 json 或 xml 工作的见解,将不胜感激。

1
你只需要问自己,从这个操作中你期望得到什么样的HTML响应?Spans、divs、labels、table?虽然使用json和xml可以更或多或少地预测结果,但对于HTML来说很难想出通用的解决方案。你应该手动生成它,并与正确的响应头一起返回。 - Ramunas
我将使用RazorEngine在视图中呈现对象,我不需要一个弹性的“通用”解决方案。因此,每个返回类型都将手动生成。 - cvbarros
WebAPI和Razor?看起来像普通的ASP.NET MVC。 - Ramunas
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<>是一个生成OkNegotiatedContentResult<>类型实例的快捷方法。

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

问题在于OkNegotiatedContentResult<>类型与上述使用场景#2中的情况相似,即它们在内部运行谈判者。

因此,总之,如果您计划支持text/html媒体类型,则需要编写自定义格式化程序并将其添加到Web API的格式化程序集合中,然后当您使用Ok<string>("Hello")并带有text/html的接受标头时,您应该看到响应以text/html的形式呈现。希望这可以帮助到您。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接