ASP.NET Web API-不允许放置和删除动词-IIS 8


145

我最近从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
leppie 2012年

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

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

Answers:


162

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

要将PUT和DELETE动词与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。


9
对于IIS8上OPTIONS动词的类似问题(处理程序之前有其他东西在拦截),请尝试在web.config中<remove name =“ OPTIONSVerbHandler” />。为此,我建议您尽可能在本地web.config中使用“删除”技术,而不是将applicationhost.config弄乱,这是一般规则
Jason

7
与其在服务器级别删除WebDAV(可能会产生连锁反应),不如从您的项目中删除它,最好如下所示:stackoverflow.com/a/14465655/428280
2013年

然后什么?甚至可以在本地使用,但不能在Azure上使用
Toolkit

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

另外,WebDAVModule根据Santosh Sah的答案,我还需要从模块部分删除。
Ivaylo Slavov

125

如下更改您的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>

3
删除WebDavModule是解决此问题的正确方法。
MissRaphie 2014年

6
保存了我的一天:<modules runAllManagedModulesForAllRequests =“ true”> <删除名称=“ WebDAVModule” /> </ modules>
Peter Stegnar

3
不需要自定义标头,因为它们与CORS相关,这样就导致了安全漏洞。只是有关的部分WebDAVModule是相关的。
安德烈·韦朗(AndréWerlang)

2
此答案是正确的,唯一的例外是处理程序名称在IIS版本之间可能有所不同-例如7.5使用"ExtensionlessUrlHandler-Integrated-4.0"(如上答案),而IIS 8.5已重命名为"ExtensionlessUrl-Integrated-4.0"(也由Mark S提及处理程序的名称显示在IIS错误页面,一旦收到错误,就不容易知道要设置哪个了。我使用两个名称来支持不同的托管环境
Ivaylo Slavov 2015年

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

61

删除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或machine.config修复此问题以授予授权,如果应用程序托管在另一台计算机上则不会发生


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

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

3
只是删除框架4.6.2 iis8.5上的webdav作品
Abdul Rehman说

45

更新您的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

无需修改主机配置。


1
我已经写过另一行了,但是没有用。添加<remove name =“ WebDAVModule” />和<remove name =“ WebDAV” />行后,它现在可以工作了。非常感谢我的一票。
Banketeshvar Narayan

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

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

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

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

18

在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内容,而是将上面的相关设置合并到了自己的设置中。
基思·沃尔顿

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

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

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

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

5

这对我在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

5

对于可能遇到此问题的其他任何人,只是一个快速更新。从今天开始,更改%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>

4

启用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



3

经过无休止的搜索并尝试了已提供的答案(添加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)

3

对于PHP,这很简单:

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

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


2

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

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

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

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

您可以更改ID的数据类型。

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

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

注意:还请确保您通过url传递数据,而不是将有效负载作为正文内容传递的数据方法。

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

例:

DELETE http://localhost/item/1

希望能帮助到你。


2

我已经遇到你同样的问题,然后解决它,下面是解决方案,我想这也许可以帮助
第一

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

第二

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

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

在此处输入图片说明


1
我只从IIS网站上删除了WebDAVModule,并且对我
有用

1

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

  1. 打开%userprofile%\ ducuments \ iisexpress \ config \ applicationhost.config

  2. 默认情况下,给定的条目在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"
 />

4
搞砸了applicationhost.config?nope
工具包

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

1

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

  1. 在IIS管理器中,选择要允许PUT或DELETE的站点。

  2. 单击“请求过滤”选项。点击“ HTTP动词”标签。

  3. 点击边栏中的“允许动词...”链接。

  4. 在出现的框中,键入“ DELETE”,然后单击“确定”。

  5. 再次单击侧边栏中的“允许动词...”链接。

  6. 在出现的框中,键入“ PUT”,然后单击“确定”。


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

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

1

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

这是起作用的。我没有在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" />

0

另一个原因可能是:
我根据此答案更改了Web Api方法的Url :

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

但是此方法会创建如下链接:

/api/MyApiCtrl?action=MyAction

这适用于GET和POST请求,但不适用于PUT或DELETE。
所以我只用:

/api/MyApiCtrl

它解决了这个问题。


0

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

以下步骤有助于我;

  1. 我去了IIS管理器。
  2. 在左侧面板中选择站点。
  3. 在左侧工作区中,选择WebDAV,然后双击打开它。
  4. 在最右边的面板中,将其禁用。

现在一切正常。


-1

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

 [HttpPost]
 public void Delete(YourDomainModel itemToDelete)
 {
 }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.