ASP.NET Web API - PUT&删除动词不允许 - IIS 8

时间:2012-06-05 23:34:09

标签: asp.net iis asp.net-web-api iis-8

我最近从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?

19 个答案:

答案 0 :(得分:156)

好。我终于到底了。你需要跳过一些箍来让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删除请求,则默认情况下,您的方法应命名为“删除”。

答案 1 :(得分:112)

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

答案 2 :(得分:60)

删除 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修复它,如果应用程序托管在另一台机器上,它就不会发生

答案 3 :(得分:42)

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

无需修改主机配置。

答案 4 :(得分:16)

在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>

答案 5 :(得分:5)

这对我在iis8上的工作以及其他一些答案。我的错误是404.6具体

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

答案 6 :(得分: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>

答案 7 :(得分:4)

启用CORS(漂亮又整洁)

1.添加CORS nuget包

Install-Package microsoft.aspnet.webapi.cors

2.在WebApiConfig.cs文件中注册方法添加以下代码:

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

答案 8 :(得分:4)

在没有任何效果之后,我能够通过以下步骤解决这个问题:

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

答案 9 :(得分:3)

在无休止地搜索并尝试已经提供的答案(添加PUT,DELETE动词并删除WEBdav)之后,它只是无法正常工作。

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

Update方法列出了动词GET,奇怪吧?所以我用Google搜索了Rejected-By-UrlScan并找到了这个链接:UrlScan Broke My Blog

我去了这里:%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)

答案 10 :(得分:3)

对于PHP,它只是:

  1. 打开IIS
  2. 转到处理程序映射
  3. 点击php5.6.x或php7.0.x上的编辑
  4. 点击“请求限制”
  5. 在动词标签下,选择“以下动词之一”并添加“GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS”
  6. 我想这也适用于其他处理程序。

答案 11 :(得分:2)

除上述所有解决方案外,请检查您是否拥有&#34; ID &#34;或者DELETE方法中的任何自定义参数都匹配路由配置。

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

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

默认情况下,路线配置会在网址中查找 id 。因此,除非您在 App_Start 文件夹下更改路径配置,否则参数名称 id 非常重要。

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

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

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

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

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

示例:

DELETE http://localhost/item/1

希望它有所帮助。

答案 12 :(得分: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" />

答案 13 :(得分:1)

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

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

  2. 默认情况下,给定的条目在applicationhost.config文件中进行了注释。取消注释这些条目。

  3. <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"
     />
    

答案 14 :(得分:1)

我也遇到过同样的问题,然后解决了, 这是解决方案,希望它可以为您提供帮助
首先

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

第二

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

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

enter image description here

答案 15 :(得分:1)

以下是使用IIS管理器GUI允许额外HTTP谓词的方法。

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

  2. 点击&#34;请求过滤&#34;选项。点击&#34; HTTP动词&#34;标签

  3. 点击&#34;允许动词...&#34;侧边栏中的链接。

  4. 在出现的框中键入&#34; DELETE&#34;,单击“确定”。

  5. 点击&#34;允许动词...&#34;再次在侧栏中链接。

  6. 在显示类型&#34; PUT&#34;的框中,单击“确定”。

答案 16 :(得分:0)

在IIS 8.5 / Windows 2012R2中,这里没有提到任何内容。 我不知道删除WebDAV是什么意思,但我没有解决这个问题。

以下步骤对我有所帮助;

  1. 我去了IIS经理。
  2. 在左侧面板中选择了该网站。
  3. 在左侧工作区,选择WebDAV,双击打开。
  4. 在最右边的面板中,禁用它。
  5. 现在一切正常。

答案 17 :(得分:0)

另一个原因可能如下:
我根据this answer更改了我的Url for Web Api方法:

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

但是这种方法可以创建如下链接:

/api/MyApiCtrl?action=MyAction

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

/api/MyApiCtrl

它解决了这个问题。

答案 18 :(得分:-1)

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

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