在我的应用程序中,我正在向我的Api控制器发出一些javascript请求,以获取一些html格式的字符串。当使用Accept: */*
HTTP标头(jQuery $.get
方法)发出这些请求时,默认使用JsonMediaTypeFormatter
,并以JSON格式返回Content-Type: application/json
数据。
我希望将*/*
个请求作为text/html
来处理。所以我尝试创建支持MediaTypeFormatter
媒体类型的自定义*/*
,但它给了我以下错误
*/*
的'MediaTypeHeaderValue'不能用作支持 媒体类型,因为它是媒体范围。
或者我总是可以在我的请求中提供正确的预期数据类型,但我很好奇是否有办法处理*/*
媒体类型。
答案 0 :(得分:7)
以上行为是由于以下原因造成的:
Web API中的默认con-neg算法具有以下优先顺序选择响应的格式化程序:
现在,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());