ASP.Net WebAPI HttpDelete/PUT方法运行或发布到生产服务器上后出现405(Method Not Allowed)错误的解决办法

2021-06-16 15:04

阅读:450

本文只是个人的理解和学习记录,如果觉得本文写的业余或者表达不清楚,可以直接去参考这里。? ??

最近在写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,具体内容为

技术图片

这使得WebAPI方法支持HttpDelete谓词,但根据前面msdn大牛的建议,最好还是先将可能出现匹配冲突的WebDAV去掉防止生产服务器上运行出错,具体方法可以参看上图handler节点与modules节点中的remove子节点的写法

总结一下:

step1、? ? 节点下增加一行去掉WebDAV的命令

step2、在modules节点下增加一行命令去掉WebDAVModule的命令

step3、重新定义WebAPI相关的handler;对于WebAPI,此行由框架自动添加

?

到此,ASP.Net WebAPI 运行或发布到生产服务器上后出现405(Method Not Allowed)错误的来龙去脉以及解决办法就比较清楚了。希望能帮助到大家。

?


评论


亲,登录后才可以留言!