ASP.NET Core与IIS - HTTP动词不允许

73

我们有一个运行在ASP.NET Core 2.0的网站,同时还提供了几个简单的Web API方法用于增强用户界面。

当在本地使用IIS Express运行时,Web API调用按预期工作。但是,当我们将其部署到IIS 8.5生产 Web 服务器时,在进行 HTTP DELETEPUT 请求时会出现以下错误...

405 Method Not Allowed

经过一些网络搜索,我们找到了几篇帖子建议删除IIS WebDAV 模块。我们在IIS中禁用了它(这是我们的服务器),并且我们还尝试了以下操作:

  • 禁用 WebDAV
  • 启用 WebDev 并设置 Allow verb filtering = False
  • Hander Mappings 设置为在请求限制设置中允许所有动词 aspNetCore WebDAV ExtensionlessUrlHandler-Integrated-4.0

以上任何步骤都没有解决我们的问题。

如果您有任何建议/指导,我们将不胜感激。

13个回答

81

它能够工作,但这使得我的网站在 .net core 2.1 RC 中变得非常缓慢,我不得不删除这个指令。 - Alexandre
1
@Alexandre,这个设置通常只在服务网站上才需要。一个网站默认应该响应GET和POST请求,并且理论上不需要其他东西。如果你正在对你的网站进行REST调用,我建议将这些调用转移到一个子应用程序并由单独管理的应用程序池处理。 - iGanja
我在我的.NET 5应用程序上尝试了几乎所有的方法,最终找到了解决方案。我正在开发一个Blazor WASM应用程序,它托管在Blazor Web服务器上。现在,我可以将所有内容部署到Azure,并且与本地环境一样正常运行。非常感谢! - Anzel

69

经过几个小时的研究和试错后,修复方法似乎非常简单。在您的 .NET Core 2.0 应用程序中添加一个 Web.config 文件:

修复方法:在您的 .NET Core 2.0 应用程序中添加一个 Web.config 文件。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!-- To customize the asp.net core module uncomment and edit the following section. 
         For more info see https://go.microsoft.com/fwlink/?linkid=838655 -->
    <system.webServer>
        <modules>
            <remove name="WebDAVModule" />
        </modules>
        <handlers>
            <remove name="aspNetCore" />
            <remove name="WebDAV" />
            <!-- I removed the following handlers too, but these
                 can probably be ignored for most installations -->
            <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
            <remove name="OPTIONSVerbHandler" />
            <remove name="TRACEVerbHandler" />

            <add name="aspNetCore" 
                 path="*" 
                 verb="*" 
                 modules="AspNetCoreModule" 
                 resourceType="Unspecified" />
        </handlers>
        <aspNetCore processPath="%LAUNCHER_PATH%" 
                    arguments="%LAUNCHER_ARGS%" 
                    stdoutLogEnabled="false"
                    stdoutLogFile=".\logs\stdout" />
    </system.webServer>
</configuration>

希望这能有所帮助。

3
如果我尝试使用 web.config 文件发布,发布过程只到最后就会出现错误。我在其他地方读到 ASP.NET Core 2.0 不再支持 web.config 文件了。有任何想法吗? - Dickie Watkins
1
@DickieWatkins,在我的情况下,使用Asp.Net Core 2.1,并从Visual Studio部署时,web.config将作为部署过程的一部分在服务器上自动生成。如果您只需将该文件复制到您的项目中,按照此答案中所示添加<modules><remove name="WebDAVModule"/></modules>,然后将构建规则设置为“始终复制”,那么在以后的部署中将使用相同的webconfig,但会自动附加。但是,这可能取决于您的部署方法以及是否正在运行IIS。 - Kevin Fichter
非常感谢,我只用了半天时间就意识到我的服务器有问题,而不是应用程序本身,IIS才是问题所在。 - Nicu
发现这对我来说是唯一需要的:<handlers> <remove name="WebDAV" /> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\CCPOAdmin.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" /> <modules> <remove name="WebDAVModule" /> </modules> - Rob10e
这些都对我没用。我正在使用.NET Core 3.1、IIS Express 10.0和Visual Studio 2019。我无法让HTTP PUT工作。这让我疯了!有任何想法吗? - Ant Waters
显示剩余2条评论

9

如果删除WebDAV可能可以解决您的问题,但您可能会好奇(就像我一样),什么是WebDAV以及它有什么用处?

我找到了这个页面来帮助解释:

https://www.cloudwards.net/what-is-webdav/


8
在我的情况下,我在使用 .Net 5 Web API PUT 和 DELETE 调用时遇到了 405 错误。我尝试了多种解决方法,例如移除 WebDAV(打开 Windows 功能 -> IIS -> 万维网服务 -> 常见 HTTP 功能 -> WebDAV 发布),但是没有起作用。编辑 "Handler Mappings" 中的 WebDAV 条目会使应用程序出现问题。
解决方案:
1. 在 IIS 中选择应用程序 2. 添加规则以允许 Request Filtering 中的 HTTP 动词(仅此不足无法解决问题) 3. 进入 "Modules",然后选择 "WebDAV Publishing" 模块并将其删除。 4. 进入 "Handler Mappings",然后选择 "WebDAV" 并将其删除。 5. 在 cmd 中运行 IISRESET。

1
对我来说,使用.NET 5,只需要步骤2和3就可以解决它。非常感谢。 - dave
我真的不知道怎么向你表示感谢... 你救了我的命。我已经连续四天四夜在尝试解决这个问题,就在截止日期前几个小时找到了你的答案。再次感谢你。 - Saurabh Kulkarni

7
将下面的代码添加到你的web.config文件中即可。

Web.config screenshot

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
        <modules>
            <remove name="WebDAVModule" />
        </modules>
      <handlers>
      
            <remove name="WebDAV" />
            <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
            <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,PUT,DELETE,DEBUG" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
            
            <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\Ftms.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>

7

为了防止WebDav被启用,需要从ApplicationHost.config中删除以下条目:

<add name="WebDAVModule" /> 

该条目位于模块部分。

配置文件的确切位置:
C:\ Windows \ System32 \ inetsrv \ config \ applicationHost.config

这在 .Net Core 2.1 中对我很有效。


2
最好添加“remove”节点,就像Manuel Alves的答案中所示。如果您的应用程序是子应用程序,则仍然可以从父Web.config中获取此设置。所选答案的代码比实际上只允许所有动词所需的代码要多得多。 - iGanja
@iGanja:根据部署过程,web.config 文件可能会被覆盖,或者在 .net core 中根本不想与其纠缠。另外,出于安全考虑,建议不要在 Web 服务器范围内添加未使用的功能。 - Yush0

6

控制面板 -> 卸载程序 -> 打开或关闭Windows功能 -> IIS -> 万维网服务 -> 常用的HTTP功能 -> WebDAV发布。 - JDNickell

5
在我的情况下,我在aspNetCore处理程序中添加了requireAccess="None"后解决了这个问题。
就像这样:
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" requireAccess="None" />

我在 web.config 文件中添加了这个,然后它就有效了。谢谢。 - omid-ahmadpour
在发布期间是否有一种自动将此添加到 Web 配置文件的方法? - David Bouška

1

我在注意到自己试图向客户端域名而非API发送请求后解决了这个问题。[扇自己一巴掌]


我搜索了几个小时,看到这个评论让我受益匪浅。非常感谢 :) - nmb

0

经过在互联网上的长时间研究,我按照以下方式解决了它;

<configuration>
<system.webServer>
    <modules>
        <remove name="ModSecurity IIS (64bits)" />
        <remove name="ModSecurity IIS (32bits)" />
    </modules>
</system.webServer>

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接