我最近从Visual Studio 2010升级到了Visual Studio 2012 RC。安装程序还会安装IIS 8 Express,现在Visual Studio将其用作默认Web服务器。

IIS 8阻止了我的使用PUT AND DELETE动词的WEB API请求。 IIS返回405错误The requested resource does not support http method 'PUT'

我知道人们过去对此有问题,并且在Stack Overflow上有关于它的几条消息。使用IIS 7 Express,解决方案是卸载WebDav。不幸的是,我看不到使用IIS 8的任何方法。

我尝试从applicationhost.config中编辑WebDav部分,但这没有帮助。例如,我从配置文件中删除了<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />

我花了太长时间了。必须有一种简单的方法来启用PUT和DELETE吗?

评论

这在RTM版本中仍然没有解决。只是在此上浪费了3个小时。所有要做的就是将多余的动词添加到ExtensionlessUrl-Integrated-4.0。

我不认为这是坏事,但这是设计使然。我认为更改默认行为会干扰WebDAV并破坏向后兼容性。当安装WebDAV时,这也不适用于IIS7。

在这篇文章发布6年后,我还为此花了3个小时。

请查看stackoverflow.com/a/55134621/4746570

#1 楼

好的。我终于明白了这一点。您需要跳过一些技巧,以使PUT和DELETE动词与IIS8一起正常工作。实际上,如果您安装VS 2012的候选发行版并创建一个新的WEB API项目,您会发现示例PUT和DELETE方法可以立即返回404错误。

要使用PUT和使用Web API删除动词,您需要编辑%userprofile%\ documents \ iisexpress \ config \ applicationhost.config并将这些动词添加到ExtensionlessUrl处理程序中,如下所示:

更改此行:

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

到:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />


除上述内容外,您还应确保WebDAV不会干扰您的请求。这可以通过在applicationhost.config中注释掉以下几行来完成。

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />
<add name="WebDAVModule" /> 
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />


还请注意,默认的Web API约定是您的方法名称应相同作为调用的HTTP动词。例如,如果您要发送HTTP删除请求,则默认情况下,您的方法应命名为Delete。

评论


对于IIS8上OPTIONS动词的类似问题(在处理程序之前其他内容正在被拦截),请尝试在web.config中。为此,我建议您尽可能在本地web.config中使用“删除”技术,而不是与applicationhost.config混淆

–詹森
13年3月28日在2:28

与其在服务器级别删除WebDAV可能会产生连锁反应,不如将其从项目中删除,如下所示:stackoverflow.com/a/14465655/428280

–扭曲
13年7月5日在12:01

然后什么?甚至可能会在本地运行,但不能在Azure上运行

–工具包
2014年8月13日在6:18



即使在开发人员机器上,指示修改系统设置的答案也不是答案。这解决了一个症状,对团队和生产并没有真正的帮助。您会在每台机器上复制吗?看看Santosh Sah的答案。

–AndréWerlang
15年5月4日在16:20

此外,根据Santosh Sah的回答,我还需要从模块部分删除WebDAVModule。

– Ivaylo Slavov
15年5月16日在9:52

#2 楼

如下更改您的Web.Config文件。

在节点<system.webServer>中添加以下代码部分

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>


添加后,您的Web.Config将如下所示

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/>
    </modules>
    <httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
    </httpProtocol>
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="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>
</system.webServer>


评论


删除WebDavModule是解决此问题的正确方法。

–拉菲小姐
2014-09-19 14:55

拯救了我的一天: <删除名称=“ WebDAVModule” />

– Peter Stegnar
2015年2月3日在8:10



不需要自定义标头,因为它们与CORS相关,这样您就可以引出安全漏洞。与WebDAVModule有关的部分是相关的。

–AndréWerlang
15年5月4日在16:22

每当我看到此内容时,它都会让我死在里面-runAllManagedModulesForAllRequests =“ true”-作为解决方案britishdeveloper.co.uk/2010/06/…

–奥利弗
2015年9月2日在15:49



注意:上面的代码中的自定义标头部分允许任何站点从浏览器调用您的API-这是很大的安全隐患。阅读有关CORS的信息,这实际上是那些标头启用的功能。

– profMamba
17年4月3日在4:17

#3 楼

删除WebDAV完全适合我的情况:

<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,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
       type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>


总是最好通过web.config解决问题,而不是通过iis或计算机来解决。如果将应用程序托管在另一台计算机上,则将其配置为被授予者

评论


这对我有用,其他人由于某种原因而没有使用(在IIS 8.5上),谢谢

–约翰
2015年11月3日在8:59

删除WebDAVModule对我有用,无需删除处理程序WebDAV(IIS 8.0)。

– PeterS
16 Mar 30 '16 at 9:02

只是删除webdav在框架4.6.2 iis8.5上工作

–阿卜杜勒·雷曼(Abdul Rehman)说
17 Mar 8 '17 at 7:07

#4 楼

更新您的web.config

  <system.webServer>
    <modules>
      <remove name="WebDAVModule"/>
    </modules>
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrl-Integrated-4.0" />
      <add name="ExtensionlessUrl-Integrated-4.0"
           path="*."
           verb="GET,HEAD,POST,DEBUG,DELETE,PUT"
           type="System.Web.Handlers.TransferRequestHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>


http://odetocode.com/blogs/scott/archive/2012/08/07/configuration-tips-for-asp- net-mvc-4-on-a-windows.aspx

无需修改主机配置。

评论


我已经写过另一行了,但是没有用。添加行后,它现在可以工作了。非常感谢我的一票。

– Banketeshvar Narayan
16-9-8上午7:35

这可行,但是由于配置锁定而无法在web.config中使用,因此可能会失败。在这种情况下,您必须禁用applicationHost.config中的配置锁定。如果由于某种原因无法控制applicationHost.config,则无法使用此方法。

–佛罗里达冬季
17年1月18日在8:07

使用IIS10,尽管我只是使用“ *”作为动词

–哈维尔G.
18年1月4日在18:06



使用IIS 10和Web API2。工作正常后,我应该补充一遍,但我在网上发现的另一打“解决方案”却没有。谢谢!

–马特·韦斯特
19年5月24日在16:07

@ChrisMarisic:这对我来说就像是一种魅力,谢谢!

– Div Tiwari
2月7日12:42

#5 楼

在Asp.Net Web API中-webconfig。这适用于所有浏览器。

在System.web标记内添加以下代码

<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>


用以下代码替换system.webserver标记代码



<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="false">
  <remove name="WebDAVModule" />
</modules>

<validation validateIntegratedModeConfiguration="false" />
<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />

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

</handlers>




评论


我在IIS 7.5中遇到了此问题,并且此修复程序运行完美。我没有删除所有的system.webserver内容,而是将上面的相关设置合并到了自己的设置中。

–基思·沃尔顿(Keith Walton)
13-10-15在0:26

注意:上面的代码中的自定义标头部分允许任何站点从浏览器调用您的API-这是很大的安全隐患。阅读CORS,实际上就是这些标头启用的功能。

– profMamba
2013年12月2日4:04



在iis 7.5上也有此问题,并且可以正常工作。请务必阅读上述工具包中有关向所有人开放核心的风险。也支持他的评论,因为这样的花絮非常有价值。

– sjdirect
2014年11月6日17:44

我认为在这种情况下根本不需要自定义标题。 system.webserver部分的其余部分就足够了-只需确保您为无扩展名url处理程序使用正确的名称即可。

– Ivaylo Slavov
2015年5月16日10:00



@niico您应仅允许受信任的网站访问控制允许来源,即用您的网站URL替换“ *”。该属性是所有受信任站点的白名单,除非您想信任整个网络(通常是个坏主意)。

– profMamba
17年4月3日在4:20

#6 楼

这对我在iis8上起作用,以及其他一些答案。我的错误是特别是404.6

<system.webServer>
  <security>
  <requestFiltering>
    <verbs applyToWebDAV="false">
       <add verb="DELETE" allowed="true" />
    </verbs>
  </requestFiltering>
  </security>
</system.webServer>


评论


当您运行AppCmd时,这就是web.Config中的内容(applyToWebDAV位除外)。

–Chase Florell
15年2月19日在20:24

#7 楼

对于可能遇到此问题的其他任何人,只是一个快速更新。从今天开始,更改%userprofile%\ documents \ iisexpress \ config \ applicationhost.config不再起作用(直到现在为止,这种方法工作正常,不确定是否是由于Windows更新)。经过数小时的无奈之后,我更改了web.config,将这些处理程序添加到system.webserver使其正常工作:

<handlers>
        <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
        <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

        <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
        <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="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>


#8 楼

启用CORS(既好又整洁)

1.添加CORS nuget包

Install-Package microsoft.aspnet.webapi.cors


2.将WebApiConfig.cs文件中的Register方法添加下面的代码:

config.EnableCors();


例如:
使用System.Web.Http;

namespace test
{
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services


        config.EnableCors(); //add this**************************


        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );           
    }
}
}


3.将以下代码添加到控制器的名称空间中,包括get,post,delete,put或任何http方法

[EnableCors(origins: "The address from which the request comes", headers: "*", methods: "*")]


例如:

using System.Web.Http.Cors;//add this******************************
namespace Test.Controllers
{
[EnableCors(origins: "http://localhost:53681/HTML/Restaurant.html", headers: "*", methods: "*")]
public class RestaurantController : ApiController
{
    protected TestBusinessLayer DevTestBLL = new TestBusinessLayer();

    public List<Restaurant> GET()
    {
        return DevTestBLL.GetRestaurant();
    }

    public List<Restaurant> DELETE(int id)
    {
        return DevTestBLL.DeleteRestaurant(id);
    }       
}
}


参考:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

#9 楼

没有任何反应后,我可以通过以下步骤解决此问题:

•在安装IIS时未选择“ WEB DAV PUBLISHING” IIS设置。
•INETMGR-默认网站-请求过滤– HTTP动词–将PUT设为True

#10 楼

经过无休止的搜索并尝试了已提供的答案(添加PUT,DELETE动词并删除WEBdav)之后,它才失效。

我去了IIS日志记录设置:>查看日志文件。在我的情况下,W3SVC4是具有最新日期的文件夹,打开该文件夹,查找最新的日志文件并看到以下条目:
GET / Rejected-By-UrlScan〜/ MYDOMAIN / API / ApiName / UpdateMETHOD

Update方法带有动词GET,很奇怪,对吧?因此,我用Google搜索Rejected-By-UrlScan并找到了此链接:UrlScan打破了我的博客。

我去了这里:%windir%\ system32 \ inetsrv \ urlscan \ UrlScan.ini

基本上,UrlScan阻止了PUT和DELETE动词。
我打开了这个INI文件,将PUT和DELETE添加到AllowVerbs并将它们从DenyVerbs列表中删除。
我保存了INI文件,它起作用了!因此,对我来说,这些步骤是ExtensionlessUrlHandler提示旁边的必要步骤。

Windows Webserver 2008 R2(64位),IIS 7.5。
我将其与DotNetNuke(DNN)WebAPI结合使用。 ASP.Net 4.0
我的更新方法:

[HttpPut]
[DnnAuthorize(StaticRoles = "MyRoleNames")]
public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData)


#11 楼

对于PHP,这很简单:


打开IIS
转到处理程序映射
单击php5.6.x或php7.0.x上的编辑
在动词选项卡下单击“请求限制”
,选择“以下动词之一”并添加“ GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS”

这也将与其他处理程序一起使用。

#12 楼

除了上述所有解决方案之外,请检查是否具有“ id”或DELETE方法中的任何自定义定义参数是否与路由配置匹配。

public void Delete(int id)
{
 //some code here
}


如果重复405错误最好如上所述将方法签名重置为默认值,然后尝试。

默认情况下,路由配置将在URL中查找ID。因此,除非在App_Start文件夹下更改了路由配置,否则参数名称id在这里很重要。

例如,以下方法应该可以正常工作:

public void Delete(string id)
{
 //some code here
}


注意:另外,请确保您通过url传递数据,而不是传递数据承载有效载荷作为主体内容的方法。

DELETE http://{url}/{action}/{id}


示例:

DELETE http://localhost/item/1


希望有帮助。

#13 楼

我也遇到过同样的问题,然后解决了这个问题,
这里是解决方案,希望它可以对您有所帮助
首先

在IIS modules配置中,循环播放WebDAVModule ,如果您的Web服务器拥有它,则将其删除

第二个

在IIS handler mappings配置中,您可以看到启用处理程序的列表,选择the PHP item,对其进行编辑,在编辑页面上,单击“请求限制”按钮,然后在模态中选择“ the verbs tab”,在指定要处理的动词标签中,选中“ all verbs radio”,然后单击“确定”,您可能还会看到警告,它显示我们使用双引号到PHP-CGI执行,然后执行

如果完成,然后重新启动IIS服务器,就可以了



评论


我只从IIS网站删除了WebDAVModule,对我有用

– Umair Malhi
18-10-6在14:23

#14 楼

我不确定您是否编辑了正确的配置文件。尝试执行以下步骤


打开%userprofile%\ ducuments \ iisexpress \ config \ applicationhost.config
。默认情况下,给定条目在applicationhost.config文件中被注释。取消注释这些条目。


<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />


<add name="WebDAVModule" />



<add name="WebDAV" path="*"
 verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK"
 modules="WebDAVModule" resourceType="Unspecified" requireAccess="None"
 />


评论


搞砸了applicationhost.config?不

–工具包
14年8月13日在6:18

除了应用程序配置文件之外,不要与其他应用程序混淆。首先,您将为整个服务器执行此操作,而忘记了,然后,许多人会怀疑它在该计算机上如何工作,而在其余计算机上却不工作。另外,如果不允许访问托管应用程序的服务器上的IIS配置文件,则必须在web.config中进行处理。假设您的开发服务器具有上述更新,您的web.config是否准确?这是放松某个人调查生产部署失败原因的好方法

– Ivaylo Slavov
15年5月16日在10:03



#15 楼

这是使用IIS管理器GUI允许额外的HTTP动词的方法。


在IIS管理器中,选择要允许PUT或DELETE的站点。
单击“请求过滤”选项。单击“ HTTP动词”选项卡。
单击侧栏中的“允许动词...”链接。
在出现的框中,键入“ DELETE”,然后单击“确定”。
再次单击侧边栏中的“允许动词...”链接。
在出现的框中,键入“ PUT”,单击确定。


评论


很好的尝试-一次不同的东西-但仍然没有用!

– ozzy432836
17年11月28日在20:36

我已经尝试过在SO和其他地方看到的其他建议。我终于尝试了一下,并且效果很好。在我的情况下,PUT和DELETE动词已经在列表中,我必须先将它们删除,然后使用Allow Verb ...链接将它们重新添加回去,但是,在没有其他条件的情况下,它仍然有效。非常感谢!

– JTennessen
17年12月11日在6:56

#16 楼

我在MVC应用程序中使用了ashx文件,以上答案对我都不起作用。 IIS10。

这就是起作用的内容。我没有在IIS或web.config中更改“ ExtensionlessUrl-Integrated-4.0”,而是将“ * .ashx”文件的“ SimpleHandlerFactory-Integrated-4.0”更改为:

<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" 
verb="GET,HEAD,POST,DEBUG,PUT,DELETE" 
type="System.Web.UI.SimpleHandlerFactory" 
resourceType="Unspecified" requireAccess="Script" 
preCondition="integratedMode,runtimeVersionv4.0" />


#17 楼

另一个原因可能是以下原因:

我根据此答案更改了Web Api的Url方法:

Url.Action("MyAction", "MyApiCtrl", new { httproute = "" })


但是此方法创建了像这样的链接:

/api/MyApiCtrl?action=MyAction


这对于GET和POST请求可正常使用,但对PUT或DELETE无效。

所以我将其替换为:

/api/MyApiCtrl


,它解决了问题。

#18 楼

在IIS 8.5 / Windows 2012R2中,这里没有提到对我有用。
我不知道删除WebDAV意味着什么,但这并不能解决我的问题。

我是下面的步骤;


我去了IIS管理器。
在左侧面板中选择了站点。
在左侧工作区中,选择WebDAV,双击将其打开。
在最右侧的面板中,将其禁用。

现在一切正常。

#19 楼

您可以将Delete方法转换为POST形式;

 [HttpPost]
 public void Delete(YourDomainModel itemToDelete)
 {
 }