ASP.NET Web API - 不允许 PUT 和 DELETE 动词 - IIS 8
Posted
技术标签:
【中文标题】ASP.NET Web API - 不允许 PUT 和 DELETE 动词 - IIS 8【英文标题】:ASP.NET Web API - PUT & DELETE Verbs Not Allowed - IIS 8 【发布时间】:2012-06-10 00:11:44 【问题描述】:我最近从 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。
我也只是在这篇文章上浪费了 3 个小时......在这篇文章发布 6 年后。
请看***.com/a/55134621/4746570
【参考方案1】:
试错不是解决此问题的正确方法。需要做的是:
识别阻止您的 PUT/DELETE 请求的来源 然后您可以将其删除、禁用甚至更好地配置它:1- 为了知道来源,您必须在 IIS 中配置 Failed Request Tracing。 2-您有“添加”要记录的错误 确保您为此跟踪条目使用较短的生命周期,以避免日志文件使您的系统不堪重负。 IIS 将为每个调用生成一个单独的 xml 文件。 3- 使用 Postman 或 Swagger 发出错误请求以生成跟踪错误条目。 4- 从上一个屏幕中,您可以选择“查看跟踪日志”以将您带到生成的日志文件。 5- 使用 Internet Explorer 打开错误的日志文件。并接受任何消息。 6-注意阻止您的请求的来源。 7- 在模块或映射处理程序中从 IIS 界面或在您的 web.config 中禁用它,如其他海报所示。
【讨论】:
【参考方案2】:我像这样将requireAccess="None"
添加到web.config
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="WebDAV" />
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" requireAccess="None"/>
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,DELETE,COPY,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,DELTE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
</handlers>
<aspNetCore processPath=".\Informing.Gateway.Api.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
</system.webServer>
</location>
</configuration>
它奏效了。就是这样
【讨论】:
【参考方案3】:我在 MVC 应用程序中使用 ashx 文件,但上述答案均不适合我。 IIS 10。
这是有效的。我没有在 IIS 或 web.config 中更改“ExtensionlessUrl-Integrated-4.0”,而是将“SimpleHandlerFactory-Integrated-4.0”更改为“*.ashx” >”文件:
<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" />
【讨论】:
【参考方案4】:我和你遇到了同样的问题,然后解决了, 这是解决方案,我希望它可能会有所帮助 首先
在 IIS modules
配置中,循环 WebDAVModule,如果您的 Web 服务器有,则将其删除
第二
在IIShandler mappings
配置中可以看到启用handler列表,选择the php item
,编辑它,在编辑页面,点击请求限制按钮,然后在modal中选择the verbs tab
,在指定要处理标签的动词,勾选all verbs radio
,然后点击ok,你也可能会看到一个警告,它表明我们使用双引号来执行PHP-CGI,然后执行
如果搞定了,重启IIS服务器就OK了
【讨论】:
我只从 IIS 网站上删除了 WebDAVModule 并且对我有用【参考方案5】:删除 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 上)谢谢 删除 WebDAVModule 为我工作,无需删除处理程序 WebDAV (IIS 8.0)。 仅删除 webdav 适用于框架 4.6.2 iis8.5【参考方案6】:在 IIS 8.5/Windows 2012R2 中,这里没有提到对我有用。 我不知道删除 WebDAV 是什么意思,但这并没有解决我的问题。
对我有帮助的是以下步骤;
-
我去了 IIS 管理器。
在左侧面板中选择了站点。
在左侧工作区,选择WebDAV,双击打开。
在最右侧的面板中,将其禁用。
现在一切正常。
【讨论】:
【参考方案7】:这是使用 IIS 管理器 GUI 允许额外 HTTP 动词的方法。
在 IIS 管理器中,选择您希望允许 PUT 或 DELETE 的站点。
单击“请求过滤”选项。单击“HTTP 动词”选项卡。
单击边栏中的“允许动词...”链接。
在出现的框中键入“DELETE”,单击“确定”。
再次点击侧边栏中的“允许动词...”链接。
在出现的框中键入“PUT”,单击“确定”。
【讨论】:
不错的尝试 - 一次不同的东西 - 但仍然没有工作! 我已经尝试过我在 SO 和其他地方看到的所有其他建议。我终于尝试了这个,它工作得很好。在我的例子中,PUT 和 DELETE 动词已经在列表中,我必须先删除它们,然后使用 Allow Verb... 链接将它们添加回来,但是,当没有其他东西时它仍然有效。非常感谢!【参考方案8】:在没有任何效果之后,我能够通过以下步骤解决这个问题:
• 安装 IIS 时未选择“WEB DAV PUBLISHING”IIS 设置。 • INETMGR - 默认网站 - 请求过滤 - HTTP 动词 - PUT 为 True
【讨论】:
【参考方案9】:对于 PHP,很简单:
-
打开 IIS
转到处理程序映射
在 php5.6.x 或 php7.0.x 上点击编辑
点击“请求限制”
在动词选项卡下,选择“以下动词之一”并添加“GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS”
我想这也适用于其他处理程序。
【讨论】:
【参考方案10】:更新您的 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
无需修改主机配置。
【讨论】:
我已经写了另一行,但它不起作用。添加行integrated
管道而不是classic
,否则这将无济于事。【参考方案11】:
启用 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
【讨论】:
【参考方案12】:只是为可能遇到此问题的其他人提供的快速更新。到今天为止,更改 %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>
【讨论】:
【参考方案13】:除上述所有解决方案外,请检查您是否有“id”或 DELETE 方法中的任何自定义参数与路由配置匹配。
public void Delete(int id)
//some code here
如果您遇到重复的 405 错误,最好将方法签名重置为默认值,然后尝试。
路由配置默认会在 URL 中查找 id。所以参数名称 id 在这里很重要,除非您更改 App_Start 文件夹下的路由配置。
您可以更改 id 的数据类型。
例如下面的方法应该可以正常工作:
public void Delete(string id)
//some code here
注意:还要确保您通过 url 传递数据,而不是通过将携带有效负载作为正文内容的数据方法。
DELETE http://url/action/id
例子:
DELETE http://localhost/item/1
希望对你有帮助。
【讨论】:
【参考方案14】:您可以将您的删除方法转换为 POST 为;
[HttpPost]
public void Delete(YourDomainModel itemToDelete)
【讨论】:
【参考方案15】:在无休止的搜索和尝试已经提供的答案(添加 PUT、DELETE 动词和删除 WEBdav)之后,它只是没有用。
我进入 IIS 日志记录设置:> 查看日志文件。在我的情况下,W3SVC4 是最新日期的文件夹,打开文件夹,查找最新的日志文件并看到以下条目: GET /Rejected-By-UrlScan ~/MYDOMAIN/API/ApiName/UpdateMETHOD
Update 方法是用动词 GET 列出的,很奇怪吧?所以我搜索了 Rejected-By-UrlScan 并找到了这个链接:UrlScan Broke My Blog。
我去了这里:%windir%\system32\inetsrv\urlscan\UrlScan.ini
基本上,UrlScan 会阻止 PUT 和 DELETE 动词。 我打开了这个 INI 文件,将 PUT 和 DELETE 添加到 AllowVerbs 并将它们从 DenyVerbs 列表中删除。 我保存了 INI 文件,它工作了!所以对我来说,这些步骤在 ExtensionlessUrlHandler 提示旁边是必要的。
Windows 网络服务器 2008 R2(64 位),IIS 7.5。 我将它与 DotNetNuke (DNN) WebAPI 结合使用。 ASP.NET 4.0 我的更新方法:
[HttpPut]
[DnnAuthorize(StaticRoles = "MyRoleNames")]
public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData)
【讨论】:
【参考方案16】:这与其他一些答案一起在 iis8 上对我有用。我的错误是专门的 404.6
<system.webServer>
<security>
<requestFiltering>
<verbs applyToWebDAV="false">
<add verb="DELETE" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
【讨论】:
当你运行 AppCmd 时,这就是你的 web.Config 中的内容(除了 applyToWebDAV 位)。【参考方案17】:在 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 内容,而是将上面的相关设置合并到我自己的设置中。 CAUTION :上述代码中的自定义标头部分允许 ANY 站点从浏览器调用您的 API - 这是一个大安全风险。阅读 CORS,这实际上是这些标头启用的内容。 在 iis 7.5 上也有这个问题,这很有效。请务必阅读上面关于向所有人开放 cors 所涉及的风险的 Toolkit 消息。也支持他的评论,因为这样的花絮非常有价值。 我认为在这种情况下您根本不需要自定义标题。system.webserver
部分的其余部分就足够了 - 只需确保您拥有用于无扩展 url 处理程序的 right name。
@niico 您应该只允许受信任的站点访问-控制-允许-来源,即用您的网站 URL 替换“*”。此属性是所有受信任站点的白名单,除非您想信任整个网络(这通常是个坏主意)。【参考方案18】:
另一个原因可能如下: 我根据this answer更改了我的Url for Web Api方法:
Url.Action("MyAction", "MyApiCtrl", new httproute = "" )
但是这种方法会创建如下链接:
/api/MyApiCtrl?action=MyAction
这适用于 GET 和 POST 请求,但不适用于 PUT 或 DELETE。 所以我只是将其替换为:
/api/MyApiCtrl
它解决了问题。
【讨论】:
【参考方案19】:如下更改您的 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 是解决此问题的正确方法。 拯救了我的一天:WebDAVModule
的部分是相关的。
每次看到这个都会让我有点死心——runAllManagedModulesForAllRequests="true"——作为解决方案britishdeveloper.co.uk/2010/06/…
CAUTION :上面代码中的自定义标头部分允许 ANY 站点从浏览器调用您的 API - 这是一个 big安全风险。阅读 CORS,这实际上是这些标头所启用的。【参考方案20】:
我不确定您是否编辑了正确的配置文件。尝试以下步骤
打开 %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?没有 除应用程序配置文件外,不要乱搞。首先-您将对整个服务器执行此操作而忘记了,然后很多人会想知道它如何在这台机器上工作而在其他机器上却不起作用。此外,如果不允许您访问托管应用程序的服务器上的 IIS 配置文件,则必须在 web.config 中解决。想象一下你的开发服务器有上述更新,你的 web.config 会准确吗?这是一个很好的方式,可以让人们花时间调查生产部署失败的原因【参考方案21】:好的。我终于明白了这一点。您需要跳过一些障碍才能使 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。
【讨论】:
对于 IIS8 上的 OPTIONS 动词的类似问题(在您的处理程序之前拦截其他东西)尝试在您的 web.config 中使用WebDAVModule
,按照Santosh Sah's answer。以上是关于ASP.NET Web API - 不允许 PUT 和 DELETE 动词 - IIS 8的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?
ASP.NET Core Web API - PUT 与 PATCH
如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?