3

在我的应用程序中,我向我的 Api 控制器发出了一些 javascript 请求,以获取一些 html 格式的字符串。当这些请求使用Accept: */*HTTP 标头(jQuery$.get方法)发出时,默认情况下JsonMediaTypeFormatter使用 so,并且数据Content-Type: application/json以 JSON 格式返回。

我想要的是将*/*请求处理为text/html. 所以我尝试创建一个MediaTypeFormatter支持*/*媒体类型的自定义,但它给了我以下错误

'MediaTypeHeaderValue'*/*不能用作支持的媒体类型,因为它是一个媒体范围。

或者,我总是可以在我的请求中提供正确的预期数据类型,但我很好奇是否有办法处理*/*媒体类型。

4

2 回答 2

7

上述行为是由于以下原因:

Web API 中默认的 con-neg 算法具有以下选择响应格式器的优先顺序:

  1. 基于媒体类型映射的格式化程序匹配。
  2. 基于请求接受标头的媒体类型的格式化程序匹配。
  3. 基于请求内容类型标头的媒体类型的格式化程序匹配。
  4. 格式化程序匹配基于它是否可以序列化响应数据的类型。

现在,JsonMediaTypeFormatter 带有一个名为 XmlHttpRequestHeaderMapping 的内置媒体类型映射,它检查传入请求并查看请求是否具有标头x-requested-with: XMLHttpRequest,以及是否没有接受标头或 Accept 标头是否只有*/*.

由于您的请求很可能如下所示,因此根据优先顺序选择 JsonMediaTypeFormatter 作为写入响应的请求:

GET /api/something
Accept: */*
x-requested-with: XMLHttpRequest

您的问题的解决方案是明确要求“text/html”,因为这是您所期望的。

GET /api/something
Accept: text/html
x-requested-with: XMLHttpRequest

我写了几篇关于内容协商的非常古老的博客文章:http: //blogs.msdn.com/b/kiranchalla/archive/2012/02/25/content-negotiation-in-asp-net-mvc4-web-api -beta-part-1.aspx
http://blogs.msdn.com/b/kiranchalla/archive/2012/02/27/content-negotiation-in-asp-net-mvc4-web-api-beta-part- 2.aspx

于 2013-06-07T02:40:47.880 回答
2

好问题。

您无法设置*/*为受支持的媒体类型,但您可以将格式化程序设置为第一个。如果没有 Accept 标头或 Accept 标头是*/*.

所以你想像这样配置你的 Web API:

config.Formatters.Insert(0, new MyHtmlFormatter());
于 2013-06-06T21:59:01.727 回答