Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net IIS 8.5上的HTTP PUT失败_Asp.net_Http_Iis_Asp.net Web Api - Fatal编程技术网

Asp.net IIS 8.5上的HTTP PUT失败

Asp.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="

这似乎是深入到IIS比我擅长!所以我有一个Web API控制器,它非常适合GET和POST。第一个屏幕截图显示了GET的处理。一切都很好,我得到了回应

但后来我提出了一个PUT请求,一切都崩溃了。它似乎在ManagedPipelineHandler中漫游,然后进入DefaultDocumentModule,并以405失败

没有安装WebDAV,我已尝试在web.config级别删除它。处理程序被重写以支持PUT

<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>
    ...