特定服务器出现HTTP 415不支持媒体类型错误,如何排查?
.NET Framework 4.5 API PUT/POST请求返回415 Unsupported Media Type错误
问题背景
网站基于.NET Framework 4.5.0、jQuery和KnockoutJS,已稳定运行6-7年。相同AJAX代码在测试服务器运行正常,但生产服务器上所有API的PUT/POST请求均返回HTTP Error 415 - Unsupported media type错误,即使是简单JSON负载也失败。
Chrome控制台返回的响应内容:
{"Message":"The request contains an entity body but no Content-Type header. The inferred media type 'application/octet-stream' is not supported for this resource."}
已尝试的操作:指定Content-Type为application/json、调整charset参数、设置Content-Encoding,均无效;在两个环境中修改charset=utf8或charset=utf-8到请求头,测试服务器始终正常,生产服务器始终报错。两台服务器均使用NetScaler负载均衡,框架版本和Windows更新一致,仅web.config配置不同。
涉事AJAX代码
$.ajax({ url: '/api/calendrierUsager/preferences', type: 'PUT', data: JSON.stringify(calendrier.configuration.viewModel.preferences()), contentType: "application/json; charset=utf-8", success: function(result) { ... } });
可能的服务器配置排查方向
- NetScaler负载均衡规则:对比测试与生产环境的NetScaler配置,检查是否存在修改、剥离请求头的规则,尤其是是否误删了
Content-Type头。重点查看HTTP请求头的转发、过滤策略 - IIS请求筛选设置:检查生产服务器IIS的请求筛选模块,是否有规则限制
Content-Type头的传递,或阻止PUT/POST请求的特定头信息 - web.config配置差异:对比测试与生产的web.config,重点关注:
<httpModules>或<modules>节点的自定义模块,是否有模块在生产环境中修改了请求头<handlers>节点中API对应处理程序(如Web API Handler)的配置是否一致,是否生产环境缺少必要配置项<system.webServer>下的<security>、<rewrite>规则,是否存在重写或修改请求头的逻辑
- IIS MIME类型配置:确认生产服务器IIS是否正确配置了
application/json的MIME类型,避免因类型缺失导致请求处理异常 - 防火墙/安全软件拦截:排查生产环境的防火墙、安全防护软件,是否存在拦截或修改HTTP请求头的情况,导致
Content-Type头丢失 - Web API格式化器配置:检查web.config中Web API的格式化器设置,确认生产环境是否正确注册了
application/json媒体类型的支持,未限制JSON格式化器的使用
内容的提问来源于stack exchange,提问作者Jean-Sébastien Gervais
相关产品推荐
相关产品推荐

