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吗?
#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中
–詹森
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
拯救了我的一天:
– 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中使用
–佛罗里达冬季
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)
{
}
评论
这在RTM版本中仍然没有解决。只是在此上浪费了3个小时。所有要做的就是将多余的动词添加到ExtensionlessUrl-Integrated-4.0。我不认为这是坏事,但这是设计使然。我认为更改默认行为会干扰WebDAV并破坏向后兼容性。当安装WebDAV时,这也不适用于IIS7。
在这篇文章发布6年后,我还为此花了3个小时。
请查看stackoverflow.com/a/55134621/4746570