WebApi v2不接受text / plain媒体类型

时间:2016-09-07 14:40:22

标签: c# jquery asp.net-web-api internet-explorer-9 mediatypeformatter

此问题始于IE9,对于POST请求,contentType必须为text/plain,而application/json将不起作用。

我添加了moonscript并继续使用contentType: text/plain。我还将自定义媒体类型添加到api中,如下面的多种表单所示:

并添加text/plain媒体类型插入WebApiConfig

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;

// allows 'text/plain' as a supported media type
config.Formatters.Add(new TextMediaTypeFormatter());

但是,在IE9中发帖(使用模拟)时,我仍然收到415 Unsupported Media Type

Key Value Response HTTP/1.1 415 Unsupported Media Type

$.ajax({
    type: "POST",
    url: hope_forms.viivApiUrl + 'newsletter',
    contentType: 'text/plain',
    data: JSON.stringify(model),
    success: function (data) {
           .....
    },
    error: function (responseText) {
           console.log(responseText)
           modal.showModal('Something went wrong, please try again.');
   }                    
});

增加:

如果某些事情发生故障,这是完整的WebApiConfig

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

// Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
// To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
// For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
//config.EnableQuerySupport();

config.EnableSystemDiagnosticsTracing();


//config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;

// allows 'text/plain' as a supported media type
config.Formatters.Add(new TextMediaTypeFormatter());

我还更改了ajaxTransport xhr包装器以使用它: https://github.com/gfdev/javascript-jquery-transport-xdr

注意:

截至今天,09/21,我已将所有POST次请求切换为GET,但我仍希望能够将这些类型转换回POST

1 个答案:

答案 0 :(得分:1)

我认为您已经遇到了根据this MSDN blog

在2014年出现的奇怪XDomainRequest问题
  

注意:截至2014年,XDomainRequest似乎根本不会发送任何Content-Type标头。当这种情况发生变化时,我不清楚。

Here's之前关于该主题的SO问题也实际上引用了该博客。

这也是您正在使用的jQuery扩展的文档的备份。在Readme.md

  

XDomainRequest有一些限制:

     
      
  • 请求中没有Content-Type标头
  •   

因此,如果您检查HttpContext.Request.ContentType我认为它将为空/空,在这种情况下您应该能够分配响应类型&#34; text / plain&# 34;并向它的神灵祈祷。

基本上IE&lt; 10支持XDomainRequest(甚至XDomainRequest本身)是垃圾。它基本上与我的理解和IE 10 implemented CORS support for XHR requests

有关