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
- find
ExtensionlessUrlHandler-ISAPI-4.0_32bit
并双击 - 在出现的对话框中,点击
Request Restrictions
- 在动词选项卡上添加缺less的逗号分隔的HTTP动词(在我的情况下是
PUT
和DELETE
- 在需要的地方单击
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应用程序池一起工作,因为它的preCondition
是integratedMode
。
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>
哪个对我来说工作得很好。
我解决了这个问题,通过改变我的网站的应用程序池到集成模式,当它以前在经典模式。
- MVC4的DataType.Date EditorFor不会显示在Chrome中的date值,在Internet Explorer罚款
- 将数据注释添加到由entity framework生成的类
- razor的意见是不给编译时错误
- 安装ASP.NET和Web Tools 2015(RC1 Update 1)后,Visual Studio 2015错误“对象引用未设置为对象的实例”
- Windows更新导致MVC3和MVC4停止工作
- WCF vs ASP .Net Web API
- ASP.NET MVC Editor-Templates / UIHint带参数
- ASP.NET MVC 4,抛出HttpException vs返回HttpStatusCodeResult?
- 在控制器方法中重新validation修改后的ViewModel?