ASP.NET Web API仅在某些服务器上为PUT返回404

Gre*_*hus 30 iis-7.5 asp.net-mvc-4 asp.net-web-api

我编写了一个使用ASP.NET MVC Web API的站点,一切都运行良好,直到我把它放在登台服务器上.该站点在我的本地计算机和开发Web服务器上运行良好.开发和登台服务器都是Windows Server 2008 R2.

问题是:基本上网站工作,但有一些API调用使用HTTP PUT方法.这些失败在分段返回404,但在其他地方工作正常.

我遇到并修复的第一个问题是请求过滤.但仍然得到404.

我在IIS中打开了跟踪并遇到以下问题.

168. -MODULE_SET_RESPONSE_ERROR_STATUS 
ModuleName IIS Web Core 
Notification 16 
HttpStatus 404 
HttpReason Not Found 
HttpSubStatus 0 
ErrorCode 2147942402 
ConfigExceptionInfo  
Notification MAP_REQUEST_HANDLER 
ErrorCode The system cannot find the file specified. (0x80070002) 
Run Code Online (Sandbox Code Playgroud)

开发和分期时的配置是相同的,事实上整个站点是直接副本.

为什么GET和POST工作,而不是PUT?

Kev*_*man 47

对于那些没有启用WebDAV但仍然使用MVC 4的Web API来解决这个问题的人......

史蒂夫米凯洛蒂记载,为我工作的解决方案在这里.

在一天结束时,我将所有动词(verb ="*")启用到我的Web配置中的ExtensionlessUrlHandler-Integrated-4.0处理程序.

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
        <handlers>
            <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
            <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)


Ali*_*tad 26

这些IIS服务器上安装了web-dav模块,我敢打赌它不需要安装,因为安装人员勾选了所有框.

只需从iis中删除web-dav即可.

或者使用web.config删除web dav模块:

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    ...
Run Code Online (Sandbox Code Playgroud)


win*_*yip 12

这似乎有很多原因.以上都不适合我.我已经在web.config中使用了所有必需的HTTP谓词的ExtensionlessUrlHandler设置.最后我不得不在IIS中进行以下更改:

  • 在IIS中选择您的网站并双击 Handler Mappings
  • 查找ExtensionlessUrlHandler-ISAPI-4.0_32bit并双击
  • 在出现的对话框中,单击 Request Restrictions
  • 在动词选项卡上添加用逗号分隔的缺少的HTTP动词(在我的例子中它是PUTDELETE
  • 单击Ok需要的位置并YesEdit Script Map弹出的对话框中回答.
  • 重复一遍 ExtensionlessUrlHandler-ISAPI-4.0_64bit

希望这有助于某人:)


小智 5

我的托管服务提供商无法卸载WebDAV,因为这会影响每个人.

这个,runAllManagedModulesForAllRequests ="true",但有效但不推荐.

许多修复包括删除WebDAVModule的模块,但仍然无法正常工作.我也删除了处理程序,最后我可以使用所有动词POST GET PUT DELETE.

删除模块和处理程序中的WebDAVModule和WebDAV.

<modules>
    <remove name="WebDAVModule" />
</modules>
<handlers>
    <remove name="WebDAV" />
</handlers>
Run Code Online (Sandbox Code Playgroud)