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

(从服务器故障交叉post。我后来意识到,我可能应该先问stackoverflow)

好吧,我一直在绞尽脑汁和互联网寻求解决办法。 我只是无法弄清楚。

我写了一个使用ASP.NET MVC Web API的站点,并且所有的工作都很好,直到我把它放在分段服务器上。 该网站在我的本地机器和开发Web服务器上正常工作。 开发和登台服务器都是Win Server 2008 R2。

问题是这样的:基本上这个站点工作正常,但是有一些使用HTTP PUT方法的API调用。 这些失败在分期返回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) 

configuration在dev和staging上是一样的,事实上整个站点是直接复制的。

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

谢谢

格雷格

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

只需从iis中删除web-dav。

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

 <system.webServer> <modules> <remove name="WebDAVModule" /> </modules> ... 

对于那些没有启用WebDAV,但仍然遇到这个问题使用MVC 4的Web API …

Steve Michelottilogging了一个在我这里工作的解决scheme。

在一天结束时,我启用了所有的动词(动词=“*”)到我的webconfiguration中的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> 

这似乎有很多原因会发生这种情况。 以上都没有为我工作。 我已经在web.config中使用所有必需的HTTP动词了ExtensionlessUrlHandler设置。 最后,我不得不在IIS中进行以下更改:

  • 在IIS中select您的网站,然后双击Handler Mappings
  • findExtensionlessUrlHandler-ISAPI-4.0_32bit并双击
  • 在出现的对话框中,点击Request Restrictions
  • 在动词选项卡上添加缺less的逗号分隔的HTTP动词(在我的情况下是PUTDELETE
  • 在需要的地方单击Ok ,然后在popup的Edit Script Map对话框中回答Yes
  • 重复ExtensionlessUrlHandler-ISAPI-4.0_64bit

希望这有助于某人:)

我的托pipe服务提供商不能卸载WebDAV,因为这会影响到每个人。

这,runAllManagedModulesForAllRequests =“true”,工作,但不build议。

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

在模块和处理程序中删除WebDAVModule和WebDAV。

 <modules> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> </handlers> 

我解决了这个问题,删除了UrlScan ISAPIfilter

在我的情况下,这些解决scheme都没有应用。

我通过将我的应用程序池更改为集成而不是经典来修复它。

处理程序:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

不会与Classic应用程序池一起工作,因为它的preConditionintegratedMode

West-Wind公司的Rick Strahl推荐如下:

     <处理程序>
     <remove name =“ExtensionlessUrlHandler-Integrated-4.0”/>
     <add name =“ExtensionlessUrlHandler-Integrated-4.0”
     PATH = “*”。
    动词= “GET,HEAD,POST,DEBUG,PUT,DELETE,贴剂,OPTIONS”
    types= “System.Web.Handlers.TransferRequestHandler”
    前提= “integratedMode,runtimeVersionv4.0”
     />
     </ handlers>
    

哪个对我来说工作得很好。

我解决了这个问题,通过改变我的网站的应用程序池到集成模式,当它以前在经典模式。