看完之后 这篇博文 关于如何从中返回HTML Web API 2 运用 IHttpActionResult
,我想以某种方式“连线”这个 IHttpActionResult
对我的 ApiController
基于 Accept
随请求发送的标头。
给定具有与此类似的签名的控制器操作:
public MyObject Get(int id)
{
return new MyObject();
}
如果请求指定了 Accept: text/html
, 这个 IHttpActionResult
应该用来返回HTML。那可能吗?此外,对于这个内容协商管道如何为json或xml(具有内置支持)工作的一些见解将不胜感激。
如果我们继续讨论 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
。希望这可以帮助。