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文件内容]: $ ...
随机推荐
- 微软自拍应用iOS版公布
微软自拍(Microsoft Selfie)主要是支持自拍后还能加强自拍效果的功能. 只是和其它自拍应用不同的是.Microsoft Selfie 利用了机器学习来增强照片,应用会"考虑年龄 ...
- 2、TaskFactory类
使用实例化的TaskFactory类,在其中把TaskMethod方法传递给StartNew()方法,就会立即启动任务. 1: TaskFactory tf = new TaskFactory(); ...
- jQ-多选按钮实现单选按钮的功能以及input按钮的优化
css: .displayN{display: none;} label {font-size:12px;cursor:pointer;} label i {font-size:12px;font-s ...
- Node里面的对象创建问题
1.利用new Object()创建时 var a =new Object() a.b = 1 console.log(a) // 打印出来是[object Object] console.log(J ...
- 洛谷 P1109 学生分组
P1109 学生分组 题目描述 有N组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界R和下界L(L<=R),每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使 ...
- 地图上显示div点位
功能核心: 地理坐标转屏幕坐标 用到的插件:jquery animo动画插件 核心代码: var point = new Point(lon, lat, map.spatialReference) ...
- curl如何发起DELETE/PUT请求
curl如何发起DELETE/PUT请求 DELETE: curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); PUT: curl_setopt($ch ...
- bootstrap课程11 模态框如何使用
bootstrap课程11 模态框如何使用 一.总结 一句话总结:多看手册咯. 1.模态框对应的英文单词是什么? modal,而不是madel 2.bootstrap中如何关闭某个效果? 比如要关掉m ...
- vue实现多语言国际化(vue-i18n),结合element ui、vue-router、echarts以及joint等。
老板说我们的项目要和国际接轨,于是乎,加上了多语言(vue-i18n).项目用到的UI框架是element ui ,后续echarts.joint等全都得加上多语言. 一.言归正传,i18n在vue项 ...
- GIT,SVN,CVS的区别比较
Git .CVS.SVN比较 项目源代码的版本管理工具中,比较常用的主要有:CVS.SVN.Git 和 Mercurial (其中,关于SVN,请参见博客:SVN常用命令 和 SVN服务器配置) 目 ...