WebApi:* / *媒体类型处理

时间:2013-06-06 21:53:37

标签: asp.net-web-api

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

我希望将*/*个请求作为text/html来处理。所以我尝试创建支持MediaTypeFormatter媒体类型的自定义*/*,但它给了我以下错误

  

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

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

2 个答案:

答案 0 :(得分:7)

以上行为是由于以下原因造成的:

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

  1. 基于媒体类型映射的格式化程序匹配。
  2. 格式化程序匹配基于请求接受标头的媒体类型。
  3. 格式化程序匹配基于请求内容类型标头的媒体类型。
  4. 格式化程序匹配基于它是否可以序列化响应数据的类型。
  5. 现在,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

答案 1 :(得分:2)

很棒的问题。

您无法将*/*设置为支持的媒体类型,但您可以将格式化程序设置为第一个。 Web API将选择格式化程序集合中的第一个格式化程序,如果没有Accept标头或者Accept标头为*/*,则可以写出该类型。

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

config.Formatters.Insert(0, new MyHtmlFormatter());