C# WebAPI项目,不支持HttpPut请求!!!

有点标题党了,这个异常的现象是这样的:

我有一个正在跑的项目,要对接第三方厂家的设备。  对方给的接口文档,里面有一个接口是需要我这边实现的,要求必须是PUT请求方式。

所以我在项目基础上,新增一个WebAPI的controller类。 实现这个接口,限定请求方式。看起来似乎一切都那么的自然。

但是,用postman做本地调试,一调用就返回404错误!!!

 

开始我以为是我的WebAPi路由配置有问题,仔细检查了路由,发现没问题。  为了验证,我又写了一个HttpGet请求的接口,用postman调试,这次通了, 说明路由配置是没问题的!!

 

那么问题出在哪里?我网上搜了搜,大家前篇一律都说是webConfig的配置问题。 

 

 

说要remove掉WebDAV节点

 

我按照网上说的,设置了,依然不行!!!!!   404错误还是存在,于是开始了长达两天的自我纠结过程。。。。。。

1.怀疑代码有问题  ——  但是不可能啊,我就写了一个空方法,仅仅是测试是否能监听到请求。 不会存在功能或者逻辑错误 !  pass

2.怀疑WebApiConfig配置问题  ——  这个也不可能,毕竟post、get都可以,只有put不行! pass

3.怀疑RouteConfig配置问题  ——  貌似也不可能。。。! pass

4.怀疑Global.asax配置问题   ——  做了各种尝试,最终也排除了这个地方出问题的可能性! pass

5.怀疑引用类库版本问题  ——  新建了一个WebAPI项目(新项目PUT请求正常),调整我的老项目,类库版本全都跟新项目相同,并且删除掉老项目无关代码。最终排除是类库版本问题!pass

6.怀疑电脑问题  ——  把代码打包给同事,让他在自己电脑上测试,同样404,所以不是电脑问题!pass

 


 

 

最后谜底揭晓:

我最后在比对新项目和老项目的 .csproj 文件和 .csproj .user文件时,发现.csproj .user有一行参数有差异

 <IISExpressUseClassicPipelineMode>true</IISExpressUseClassicPipelineMode>

这个参数是用来设置IISExpress的管道模式,true是经典模式,即IIS6之前的那种ISAPI的模式; false是集成模式,是IIS6之后的管道模式!

我发现新项目,这个参数是false,用的是集成模式!

老项目,这个参数是true,用的是经典模式!

 我选中老项目的工程,按F4,调出属性设置界面,调整模式为集成模式

然后编译、运行、postman测试。 通了!!!!!!!!!!!!!

 

 


后记:

在遇到代码的疑难杂症时,我的最强大招就是代码删减法。 一点一点去除无用代码和非关键参数变量,最后剔除到只剩下最核心的部分。

然后进行详细比对,最后基本都能找到问题根源 

 

posted @ 2020-08-19 17:27  寂寞姜大虎  阅读(613)  评论(0编辑  收藏  举报