我编写了一个使用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)
开发和分期时的配置相同,事实上整个网站都是直接复制。
为什么GET和POST会起作用,而不是PUT?
答案 0 :(得分:46)
对于那些没有启用WebDAV但仍在使用MVC 4的Web API进行此问题的人......
Steve Michelotti记录了一个对我有用的解决方案here。
在一天结束时,我在web配置中启用了所有动词(verb =“*”)到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>
答案 1 :(得分:26)
那些IIS服务器上安装了web-dav模块,我敢打赌它不需要安装,因为安装人员勾选了所有框。
从iis中删除web-dav。
或者使用web.config删除web dav模块:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
...
答案 2 :(得分:12)
这似乎有很多原因。以上都不适合我。我已经在web.config中使用了所有必需的HTTP谓词的ExtensionlessUrlHandler设置。最后,我必须在IIS中进行以下更改:
Handler Mappings
ExtensionlessUrlHandler-ISAPI-4.0_32bit
并双击Request Restrictions
PUT
和DELETE
Ok
,然后在弹出的Yes
对话框中回答Edit Script Map
。ExtensionlessUrlHandler-ISAPI-4.0_64bit
希望这有助于某人:)
答案 3 :(得分:5)
我的托管服务提供商无法卸载WebDAV,因为这会影响所有人。
这,runAllManagedModulesForAllRequests =&#34; true&#34; ,有效,但不推荐。
许多修复包括删除WebDAVModule的模块,但仍然无法正常工作。我也删除了处理程序,最后我可以使用所有动词POST GET PUT DELETE。
删除模块和处理程序中的WebDAVModule和WebDAV。
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
答案 4 :(得分:4)
我修复了此问题,删除了UrlScan ISAPI过滤器
答案 5 :(得分:4)
就我而言,这些解决方案都没有适用。
我通过将我的应用池更改为集成而不是经典来修复它。
处理程序:
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
不适用于经典应用程序池,因为其preCondition
为integratedMode
。
答案 6 :(得分:1)
< handlers> < remove name="ExtensionlessUrlHandler-Integrated-4.0"/> < add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> < /handlers>这对我来说非常好。
答案 7 :(得分:1)
嗨,对我来说,所有解决方案都没有用。我终于做到了:
1)在IIS中,选择您的应用程序。
2)转到请求过滤
3)然后选择HTTP Verbs标签
4)我发现PUT和其他动词被允许为false,但无法进行编辑,因此我删除了该动词,然后在右侧窗格中选择允许动词或右键单击列表并选择它。输入您遇到麻烦的动词和voilà!
希望这会对某人有所帮助!
答案 8 :(得分:0)
我通过将以前在经典模式下将网站的应用程序池更改为集成模式来解决此问题。