在阅读了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(具有内置支持)工作的一些见解将不胜感激。
答案 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
中看到回复。希望这会有所帮助。