如果我们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
. 希望这可以帮助。