我最近从 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?
ExtensionlessUrl-Integrated-4.0
。
好的。我终于明白了这一点。您需要跳过一些障碍才能使 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。
如下更改您的 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
的部分是相关的。
删除 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 来解决问题,如果应用程序托管在另一台机器上,则不会发生
更新您的 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>
无需修改主机配置。
integrated
管道而不是 classic
,否则这将无济于事。
在 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>
system.webserver
部分的其余部分就足够了 - 只需确保您拥有用于无扩展名 url 处理程序的 right name。
这与其他一些答案一起在 iis8 上对我有用。我的错误是 404.6
<system.webServer>
<security>
<requestFiltering>
<verbs applyToWebDAV="false">
<add verb="DELETE" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
对于可能遇到此问题的其他任何人来说,只是一个快速更新。到今天为止,更改 %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>
启用 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,它很简单:
打开 IIS 转到 Handler Mappings 单击 php5.6.x 或 php7.0.x 上的编辑 单击动词选项卡下的“请求限制”,选择“以下动词之一”并添加“GET,HEAD,POST,PUT,PATCH ,删除,选项”
我想这也适用于其他处理程序。
在没有任何工作之后,我能够通过以下步骤解决这个问题:
• 安装IIS 时未选择“WEB DAV PUBLISHING”IIS 设置。 • INETMGR - 默认网站 - 请求过滤 - HTTP 动词 - PUT 为 True
在无休止的搜索和尝试已经提供的答案(添加 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)
我和你遇到了同样的问题,然后解决了,这里有解决方案,我希望它可能对你有帮助 首先
在 IIS modules
配置中,循环 WebDAVModule,如果您的网络服务器有,则将其删除
第二
在IIS的handler mappings
配置中,你可以看到启用处理程序列表,选择the PHP item
,编辑它,在编辑页面,点击请求限制按钮,然后在modal中选择the verbs tab
,在指定动词为句柄标签,勾选all verbs radio
,然后点击ok,你也可能会看到一个警告,它表明我们使用双引号来执行PHP-CGI,然后执行
如果完成了,然后重新启动IIS服务器,就可以了
https://i.stack.imgur.com/MIjNn.png
除了上述所有解决方案之外,请检查您是否有“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
希望能帮助到你。
以下是使用 IIS 管理器 GUI 允许额外 HTTP 动词的方法。
在 IIS 管理器中,选择您希望允许 PUT 或 DELETE 的站点。单击“请求过滤”选项。单击“HTTP 动词”选项卡。单击边栏中的“允许动词...”链接。在出现的框中键入“DELETE”,单击“确定”。再次单击边栏中的“允许动词...”链接。在出现的框中键入“PUT”,单击“确定”。
我在 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" />
我不确定您是否编辑了正确的配置文件。尝试以下步骤
open %userprofile%\ducuments\iisexpress\config\applicationhost.config 默认情况下,下面给出的条目在 applicationhost.config 文件中注释。取消注释这些条目。
<add name="WebDAV" path="*"
verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK"
modules="WebDAVModule" resourceType="Unspecified" requireAccess="None"
/>
另一个原因可能如下:
我根据 this answer 更改了我的 Url for Web Api 方法:
Url.Action("MyAction", "MyApiCtrl", new { httproute = "" })
但是这种方法会创建如下链接:
/api/MyApiCtrl?action=MyAction
这适用于 GET 和 POST 请求,但不适用于 PUT 或 DELETE。所以我只是将其替换为:
/api/MyApiCtrl
它解决了这个问题。
在 IIS 8.5/Windows 2012R2 中,这里没有提到对我有用。我不知道删除 WebDAV 是什么意思,但这并没有为我解决问题。
对我有帮助的是以下步骤;
我去了IIS管理器。在左侧面板中选择了站点。在左侧工作区,选择 WebDAV,双击打开。在最右边的面板中,禁用它。
现在一切正常。
我像这样将 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>
它奏效了。而已
试错不是解决此问题的正确方法。需要做的是:
识别阻止您的 PUT/DELETE 请求的来源
然后你可以删除它,禁用它甚至更好地配置它:
https://i.stack.imgur.com/bwecP.png
对于那些可怜的灵魂,正在寻找一种方法来获取一个简单的 aspx 文件来处理 PUT、PATCH 和 DELETE 请求(是的,网络表单在上个世纪是如此,但它们仍在使用中)。它不会删除 WebDav 或之前提到的任何修复程序。这是PageHandlerFactory-Integrated-4.0
这是获得一个简单的 aspx 文件(例如 log-request.aspx
)接受所有动词所需的全部魔法:
<system.webServer>
<handlers>
<remove name="PageHandlerFactory-Integrated-4.0" />
<add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
您可以将您的 Delete 方法转换为 POST 为;
[HttpPost]
public void Delete(YourDomainModel itemToDelete)
{
}
WebDAVModule
。