Asp.net IIS 8.5上的HTTP PUT失败
这似乎是深入到IIS比我擅长!所以我有一个Web API控制器,它非常适合GET和POST。第一个屏幕截图显示了GET的处理。一切都很好,我得到了回应 但后来我提出了一个PUT请求,一切都崩溃了。它似乎在ManagedPipelineHandler中漫游,然后进入DefaultDocumentModule,并以405失败 没有安装WebDAV,我已尝试在web.config级别删除它。处理程序被重写以支持PUTAsp.net IIS 8.5上的HTTP PUT失败,asp.net,http,iis,asp.net-web-api,Asp.net,Http,Iis,Asp.net Web Api,这似乎是深入到IIS比我擅长!所以我有一个Web API控制器,它非常适合GET和POST。第一个屏幕截图显示了GET的处理。一切都很好,我得到了回应 但后来我提出了一个PUT请求,一切都崩溃了。它似乎在ManagedPipelineHandler中漫游,然后进入DefaultDocumentModule,并以405失败 没有安装WebDAV,我已尝试在web.config级别删除它。处理程序被重写以支持PUT <handlers> <remove name="
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" />
</handlers>
似乎我错过了请求生命周期早期的交接
FREB似乎显示了PUT的一般请求开始,不确定为什么托管管道会创建额外的子请求,最终落在无法处理PUT的DefaultDocumentModule上。查看了您的场景(感谢您分享repro项目),问题是,项目管理员将webapi放在项目内的/api文件夹中
具体来说,还有/api/products,因此当http put的路径为/api/products时,IIS将其视为目录浏览请求,并拒绝为其提供put动词
解决方案:重命名api文件夹,通常不要将文件夹映射到调用REST api的地方。这在部署中不是问题,但在本地Web应用程序上,文件夹就在那里,IIS会首先处理它
另一个解决方案(尽管不太推荐)是使用
<modules runAllManagedModulesForAllRequests="true" />
这将使ASP.NET在IIS之前获得第一次破解,但这并不是解决此类小问题的推荐做法。我也遇到过类似的问题。对于IIS8.5中的动词PUT和DELETE,我的PHP REST Api返回404。结果表明,默认情况下,Fast CGI模块没有接收到所有动词 为了修复它,我将以下内容添加到web.config:
<system.webServer>
<handlers>
<remove name="PHP55_via_FastCGI" />
<add name="PHP55_via_FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.5\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>
...
...
这是针对PHP的,但我希望这对其他人有所帮助。WebAPI是否处理PUT?我的意思是它是否处理PUT动词:添加了动作方法,是的,它们被路由和动词修饰。
<system.webServer>
<handlers>
<remove name="PHP55_via_FastCGI" />
<add name="PHP55_via_FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.5\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>
...