ASP.Net WebAPI HttpDelete/PUT方法运行或发布到生产服务器上后出现405(Method Not Allowed)错误的解决办法
原文:ASP.Net WebAPI HttpDelete/PUT方法运行或发布到生产服务器上后出现405(Method Not Allowed)错误的解决办法
本文只是个人的理解和学习记录,如果觉得本文写的业余或者表达不清楚,可以直接去参考这里。
最近在写ASP.NET的WebAPI,但是在使用HttpDelete方法的时候,总是碰到405的错误,也就是Method Not Allowed。
实际上接口方法前面加上了正确的HttpDelete谓词,现在依然提示405。想看解决方案可以直接跳到最后。
据(上述链接里的)msdn大牛介绍,一般而言,在运行WebAPI的接口方法前,IIS会根据接口的方法类型/谓词(HttpPost、HttpGet、HttpPut、HttpDelete)从安装目录的配置文件applicationHost.config中(一般为C:\Program Files (x86)\IIS Express\config\templates\PersonalWebServer)匹配符合该类谓词定义的handler然后采用这个handler执行相应的操作;但是applicationHost.config文件里有一个handler,叫WebDAV,WebDAV定义了与ExtensionlessUrlHandler(用于处理WebAPI的handler)类似的HTTP谓词集合。二者产生了冲突,而IIS优先调用了WebDAV handler(初步分析,是因为WebDAV的定义在ExtensionlessUrlHandler之前,所以首先匹配到了WebDAV),可能具体的问题场景不尽相同,这是导致生产服务器报405的一种原因。
我们通过applicationHost.config里面关于WebDAV的定义可以看到,
WebDAV也定义了Detete谓词,但WebDAV并非处理WebAPI的handler;
而真正用于处理WebAPI的handler,大家可以看下,在整个配置文件的最后,
而且,我们发现,ExtensionlessUrlHandler默认并没有支持Delete谓词,所以就导致了上述405的错误。
我们在项目的web.config下添加这样一个handler,具体内容为
<add name="ExtensionlessUrlHandler-Integrated-4.0"
path="*."
verb="*"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0"
/>
这使得WebAPI方法支持HttpDelete谓词,但根据前面msdn大牛的建议,最好还是先将可能出现匹配冲突的WebDAV去掉防止生产服务器上运行出错,具体方法可以参看上图handler节点与modules节点中的remove子节点的写法
总结一下:
step1、在<system.webServer> <handlers>节点下增加一行去掉WebDAV的命令
<remove name="WebDAV" />
step2、在modules节点下增加一行命令去掉WebDAVModule的命令
<remove name="WebDAVModule" />
step3、重新定义WebAPI相关的handler;对于WebAPI,此行由框架自动添加
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
到此,ASP.Net WebAPI 运行或发布到生产服务器上后出现405(Method Not Allowed)错误的来龙去脉以及解决办法就比较清楚了。希望能帮助到大家。
ASP.Net WebAPI HttpDelete/PUT方法运行或发布到生产服务器上后出现405(Method Not Allowed)错误的解决办法的更多相关文章
- ASP.NET MVC WebAPI Put和Delete请求出现405(Method not allowed)错误
解决办法: 在站点根目录下的web.config设置如下(主要参考添加项): <system.webServer> <modules> <remove name=&quo ...
- spark运行时出现Neither spark.yarn.jars nor spark.yarn.archive is set错误的解决办法(图文详解)
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- WebApi HTTP Put 405 Method not allowed
总结列表: 1. There is already an open DataReader associated with this Connection which must be closed fi ...
- ASP.NET 开发必备知识点(1):如何让Asp.net网站运行在自定义的Web服务器上
一.前言 大家都知道,在之前,我们Asp.net 的网站都只能部署在IIS上,并且IIS也只存在于Windows上,这样Asp.net开发的网站就难以做到跨平台.由于微软的各项技术的开源,所以微软自然 ...
- net网站运行在自定义的Web服务器上
ASP.NET 开发必备知识点(1):如何让Asp.net网站运行在自定义的Web服务器上 一.前言 大家都知道,在之前,我们Asp.net 的网站都只能部署在IIS上,并且IIS也只存在于Win ...
- asp.net报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的解决办法
来源:http://ajxfxb.blog.163.com/blog/static/56675086201411634336878/ 作者是:没完没了的工作 asp.net报错“尝试读取或写入受保护的 ...
- Sublimetext (for windows)编译运行c出现Error 2错误的解决办法
错误描述大概如下: [Error 2] [cmd: [u'bash', u'-c', u"g++ 'D:\\codeblocks\\project\\test.c' -o 'D:\\ ...
- 关于jquery html()方法获取带有OBJECT标签的元素内容时,出现“类型不匹配。”的解决办法
关于jquery html()方法获取带有OBJECT标签的元素内容时,出现“类型不匹配.”的解决办法 解决办法: $("selector").clone().html()
- Visual Studio下运行PowerShell脚本自增小版本号并发布到Nuget服务器上
Visual Studio下运行PowerShell脚本自动更新项目里AssemblyInfo.cs文件的版本(自增小版本号)并发布到Nuget服务器上 附脚本[ update.ps1文件内容]: $ ...
随机推荐
- js16--自定义原型对象
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- 在Linux下用CANopenSocket协议模拟CAN总线通讯
一.参考文档 https://github.com/CANopenNode/CANopenSocket //下载 CANopenSocket 的源码 http://elinux.org/Can-uti ...
- Redmine安装
http://www.itnpc.com/news/web/146433249372595.html http://www.cnblogs.com/iluzhiyong/p/redmine.html ...
- js遍历对象的属性和方法
js遍历对象的属性和方法 一.总结 二.实例 练习1:具有默认值的构造函数 实例描述: 有时候在创建对象时候,我们希望某些属性具有默认值 案例思路: 在构造函数中判断参数值是否为undefined,如 ...
- 如何查看kafka消费者信息?
看kafka消费者信息? 进入cd $ZOOKEEPER_HOME/bin下. ./kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zoo ...
- 前端面试题(JavaScript)
(前端面试题大全,持续更新) 箭头函数特点?箭头函数和普通函数的区别 手写懒加载(考虑防抖和重复加载问题) 手写bind(为什么要加预参数,为什么要加new) apply, call, bind ne ...
- ThinkPHP5.0---删除数据
删除特定记录 public function delete() { // 获取要删除的对象:关键字为16 $Teacher = Teacher::); // 删除对象 $Teacher->del ...
- VIP的转移
首先查看vip在各个节点的状态 [root@rac2 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 08:00:27:C9:28:D0 inet addr: ...
- Ubuntu VMware Tools安装详细过程(非常靠谱)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.前言 VMware Ubuntu安装以及详细过程:https://blog.csdn.net/qq_41782425/arti ...
- Spring Boot 动态数据源(Spring 注解数据源)
本文实现案例场景:某系统除了需要从自己的主要数据库上读取和管理数据外,还有一部分业务涉及到其他多个数据库,要求可以在任何方法上可以灵活指定具体要操作的数据库. 为了在开发中以最简单的方法使用,本文基于 ...