ASP.NET Web API – 不允许PUT&DELETE动词 – IIS 8

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

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

我知道以前有人遇到这个问题,Stack Overflow有几个关于它的信息。 使用IIS 7 Express解决scheme是卸载WebDav。 不幸的是我没有看到任何方式与IIS 8做到这一点。

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

我在这上面花了太多时间。 必须有一个简单的方法来启用PUT和DELETE?

好的。 我终于明白了这一点。 您需要跳过一些环节才能让PUT和DELETE动词与IIS8正常工作。 事实上,如果你安装VS 2012的候选版本,并创build一个新的WEB API项目,你会发现示例PUT和DELETE方法返回404错误的框。

要使用带有Web API的PUT和DELETE动词,您需要编辑%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删除请求,则默认情况下,您的方法应该被命名为“删除”。

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

删除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修复它,如果应用托pipe在另一台机器上,则不会发生这种情况

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

删除需要修改您的主机configuration。

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

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

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

用下面的代码replace你的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> 

只是对可能遇到此问题的其他人进行快速更新。 到目前为止,更改%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> 

这与iis8和其他一些答案一起工作。 我的错误是一个404.6具体

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

没有任何工作后,我能够通过以下步骤解决这个问题:

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

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

对于PHP来说,这很简单:

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

我想这也可以和其他处理程序一起工作。

我不确定你是否编辑了正确的configuration文件。 尝试以下步骤

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

经过无尽的search和尝试已经提供的答案(添加PUT,DELETE动词和删除WEBDAV),它只是没有工作。

我去了IIS日志logging设置:>查看日志文件。 在我的情况下,W3SVC4是最新date的文件夹,打开文件夹,查找最新的日志文件,看到这个条目:GET / Rejected-By-UrlScan〜/ MYDOMAIN / API / ApiName / UpdateMETHOD

更新方法列出了动词GET,怪异的权利? 所以我谷歌search被拒绝的UrlScan和发现这个链接: UrlScan打破我的博客 。

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

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

Windows Web服务器2008 R2(64位),IIS 7.5。 我正在使用DotNetNuke(DNN)WebAPI。 ASP.Net 4.0我的更新方法:

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

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

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

如果重复405次错误,可以按照上面的方法将方法签名重置为默认值并尝试。

路由configuration默认会在URL中查找id 。 所以参数名称id在这里很重要,除非你改变了App_Start文件夹下的路由configuration。

你可以改变id的数据types。

例如下面的方法应该工作得很好:

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

注意:另外,请确保您通过url传递数据,而不是将数据方法作为主体内容传输。

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

例:

 DELETE http://localhost/item/1 

希望它有帮助。

另一个原因可能是以下几点:
根据这个答案,我改变了我的Url的Web Api方法:

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

但是这个方法创build链接如下:

 /api/MyApiCtrl?action=MyAction 

这与GET和POST请求正常工作,但不与PUT或DELETE。
所以我把它换成了:

 /api/MyApiCtrl 

并解决了这个问题。

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

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

在IIS 8.5 / Windows 2012R2中,这里没有提到为我工作。 我不知道删除WebDAV是什么意思,但没有解决我的问题。

帮助我的是以下步骤。

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

现在一切正常。

以下是如何使用IISpipe理器GUI来允许额外的HTTP动词。

  1. 在IISpipe理器中,select您希望允许PUT或DELETE的站点。

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

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

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

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

  6. 在出现的框中input“PUT”,点击OK。