原文: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)错误的解决办法的更多相关文章

  1. ASP.NET MVC WebAPI Put和Delete请求出现405(Method not allowed)错误

    解决办法: 在站点根目录下的web.config设置如下(主要参考添加项): <system.webServer> <modules> <remove name=&quo ...

  2. spark运行时出现Neither spark.yarn.jars nor spark.yarn.archive is set错误的解决办法(图文详解)

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  3. WebApi HTTP Put 405 Method not allowed

    总结列表: 1. There is already an open DataReader associated with this Connection which must be closed fi ...

  4. ASP.NET 开发必备知识点(1):如何让Asp.net网站运行在自定义的Web服务器上

    一.前言 大家都知道,在之前,我们Asp.net 的网站都只能部署在IIS上,并且IIS也只存在于Windows上,这样Asp.net开发的网站就难以做到跨平台.由于微软的各项技术的开源,所以微软自然 ...

  5. net网站运行在自定义的Web服务器上

    ASP.NET 开发必备知识点(1):如何让Asp.net网站运行在自定义的Web服务器上   一.前言 大家都知道,在之前,我们Asp.net 的网站都只能部署在IIS上,并且IIS也只存在于Win ...

  6. asp.net报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的解决办法

    来源:http://ajxfxb.blog.163.com/blog/static/56675086201411634336878/ 作者是:没完没了的工作 asp.net报错“尝试读取或写入受保护的 ...

  7. Sublimetext (for windows)编译运行c出现Error 2错误的解决办法

      错误描述大概如下: [Error 2]  [cmd:  [u'bash', u'-c', u"g++ 'D:\\codeblocks\\project\\test.c' -o 'D:\\ ...

  8. 关于jquery html()方法获取带有OBJECT标签的元素内容时,出现“类型不匹配。”的解决办法

    关于jquery html()方法获取带有OBJECT标签的元素内容时,出现“类型不匹配.”的解决办法 解决办法: $("selector").clone().html()

  9. Visual Studio下运行PowerShell脚本自增小版本号并发布到Nuget服务器上

    Visual Studio下运行PowerShell脚本自动更新项目里AssemblyInfo.cs文件的版本(自增小版本号)并发布到Nuget服务器上 附脚本[ update.ps1文件内容]: $ ...

随机推荐

  1. 保留的 IPv4 地址

    保留的IP地址   https://en.wikipedia.org/wiki/Reserved_IP_addresses 地址块(CIDR) 范围 地址数量 范围 目的 0.0.0.0/8 0.0. ...

  2. 2.FastJson公司--阿里巴巴开源的速度最快的Json和对象转换工具

    转自:https://blog.csdn.net/gongpulin/article/details/52062532 这是关于FastJson的一个使用Demo,在Java环境下验证的 这是关于Fa ...

  3. python 时间合集 一

    **以下内容均为我个人的理解,如果发现错误或者疑问可以联系我共同探讨**#### python中4种时间表示形式:1.格式化时间字符串 2.时间戳 3.时间元祖 4.时间对象- string_time ...

  4. ToggleButton控件

    ToggleButton 两种状态 ·状态button     -继承自CompoundButton ·主要属性:-Android:textOn    -Android:textOff ·主要方法: ...

  5. xcode6.3 模版位置

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templ ...

  6. windows下使用cpanm进行模块安装

    windows下使用cpanm进行模块安装 要放假了,突然想整理一下手头上的软件,突然发现perl的安装模块这个功能不能用. 弄了一下,使得windows 下 perl 的 cpanm能用,避免成天为 ...

  7. wap.css

    wap.css 一.总结 1.官方有教程:英语的 http://www.developershome.com/wap/wcss/ 2.wap.css :就是控制页面在手机端样式的 3.DOCTYPE ...

  8. socket TCP简单通讯

    socket 服务器 // // main.m // socket_server // // Created by lujunjie on 2016/11/23. // Copyright © 201 ...

  9. 有关Canvas的一点小事—canvas和resize

     之前就说了canvas设置大小的时候用的就是设置实打实的像素值,像图像一样设置百分比然后根据浏览器大小自己适应大小是不可能的——当然一般也不会想要cavans改变大小.不过项目之前有用到过,既然去了 ...

  10. 原生js大总结三

    021.定义函数的几种方式   1.关键字函数:function fnName(){};   2.字面量函数:var fn = function(){};   3.构造函数:var fn = new ...