NET Web API-不允许使用 PUT 和 DELETE 动词-IIS 8

我最近从 VisualStudio2010升级到 VisualStudio2012RC。安装程序还安装了 IIS8Express,VisualStudio 现在使用它作为默认的 Web 服务器。

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

我知道过去人们对此有疑问,Stack Overflow 上有几条关于它的消息。对于 IIS7Express,解决方案是卸载 WebDav。不幸的是,我没有看到任何方法可以做到这一点与 IIS8。

我试过从 applicationhost.config 中编辑 WebDav 部分,但是没有用。例如,我从配置文件中删除了 <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />

我已经花了太长的时间在这上面。一定有一个简单的方法来启用 PUT 和 DELETE?

218889 次浏览

我不确定您是否编辑了正确的配置文件

  1. Open% 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"
/>

好吧。我终于搞清楚了。要使 PUT 和 DELETE 动词在 IIS8中正常工作,您需要跳过一些障碍。事实上,如果您安装 VS 2012的候选版本并创建一个新的 WEB API 项目,您会发现样例 PUT 和 DELETE 方法会立即返回404个错误。

要在 Web API 中使用 PUT 和 DELETE 谓词,您需要编辑% userprofile% document iisExpress config applicationhost.config,并向 Extensionless Url 处理程序添加谓词,如下所示:

换一行:

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

还要注意,默认的 WebAPI 约定是您的方法名应该与调用的 HTTP 谓词相同。例如,如果您正在发送一个 HTTP 删除请求,那么默认情况下,您的方法应该被命名为 Delete。

在 Asp.NetWebAPI-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>

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

另一个原因可能是:
我根据 这个答案更改了我的 Url for Web Api 方法:

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

但这种方法创建的链接类似于:

/api/MyApiCtrl?action=MyAction

这对 GET 和 POST 请求可以正确工作,但对 PUT 或 DELETE 则不能。
所以我就换成了:

/api/MyApiCtrl

解决了问题。

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

不需要修改主机配置。

这对我在 iis8和其他一些答案一起工作。我的错误是一个404.6明确

<system.webServer>
<security>
<requestFiltering>
<verbs applyToWebDAV="false">
<add verb="DELETE" allowed="true" />
</verbs>
</requestFiltering>
</security>
</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 修复问题,以保证如果应用驻留在另一台机器上就不会发生这种情况

经过无休止的搜索和尝试已经提供的答案(添加 PUT,删除动词和删除 WEBdav) ,它就是不工作。

我转到 IIS 日志设置: > 查看日志文件。在我的例子中,W3SVC4是一个带有最新日期的文件夹,打开该文件夹,查找最新的日志文件,然后看到以下条目: GET/拒绝-by-UrlScan ~/MYDOMAIN/API/apiName/UpdateMethod

更新方法是用动词 GET 列出的,很奇怪吧? 所以我用 Google 搜索了拒绝的 UrlScan,找到了这个链接: UrlScan 毁了我的博客

我去了这里:% windir% system 32 inetsrv urlcan UrlScan.ini

基本上,UrlScan 阻止 PUT 和 DELETE 动词。 我打开了这个 INI 文件,向 AllowVerbs 添加了 PUT 和 DELETE,并从 DenyVerbs 清单中删除了它们。 我保存了 INI 文件并且它工作了! 因此对我来说,在 Extensionless UrlHandler 提示旁边这些步骤是必要的。

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)

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

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

除了上述所有解决方案外,还要检查 DELETE 方法中是否有“ 身份证”或任何自定义参数与路由配置匹配。

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

如果出现重复的405错误,最好将方法签名重置为默认值,如上所示,然后尝试。

默认情况下,路由配置将在 URL 中查找 身份证。因此,参数名 身份证在这里很重要,除非您更改 App _ Start文件夹下的路由配置。

不过,您可以更改 身份证的数据类型。

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

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

注意: 还要确保通过 url 传递数据,而不是将有效负载作为主体内容传递的数据方法。

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

例如:

DELETE http://localhost/item/1

希望能有帮助。

只是给其他可能遇到这个问题的人提供一个简短的更新。截至今天,更改% userprofile% document 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 核桃软件包

Install-Package microsoft.aspnet.webapi.cors

在 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

对于 PHP 来说,它很简单:

  1. 打开 IIS
  2. 转到 Handler 映射
  3. 单击 php5.6.x 或 php7.0. x 上的 edit
  4. 点击“请求限制”
  5. 在谓词选项卡下,选择“以下动词之一”并添加“ GET、 HEAD、 POST、 PUT、 PATCH、 DELETE、 OPTION”

我想这对其他处理程序也有用。

在一无所获之后,我通过以下步骤解决了这个问题:

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

下面介绍如何使用 IIS 管理器 GUI 允许额外的 HTTP 谓词。

  1. 在 IIS 管理器中,选择要允许 PUT 或 DELETE 访问的站点。

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

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

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

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

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

在 IIS8.5/Windows2012R2中,这里提到的任何东西都不适合我。 我不知道删除 WebDAV 是什么意思,但这并没有解决我的问题。

帮助我的是下面的步骤:

  1. 我去找了 IIS 经理。
  2. 在左面板中选择了站点。
  3. 在左侧工作区域,选择 WebDAV,双击打开它。
  4. 在最右边的面板上,关闭了它。

现在一切正常。

我和你面对过同样的问题然后解决了它, 这里有一些解决方案,我希望它能有所帮助
首先 < br/>

在 IISmodules配置中,循环 WebDAVModule,如果您的 Web 服务器有它,然后删除它

第二名 < br/>

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

如果这样做,然后重新启动 IIS 服务器,这将是确定的

enter image description here

我在一个 MVC 应用程序中使用了一个 ashx 文件,上面的答案对我来说都不管用。IIS10.

我没有在 IIS 或 web.config 中更改“ Extensionless Url-Integration-4.0”,而是为“ * . ashx”文件更改了“ SimpleHandlerFactory-Integration-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" />

我像这样把 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 请求的源
  • 然后,你可以删除它,禁用它,甚至更好地配置它:

为了了解源,您必须在 IIS 中配置失败的请求跟踪。 enter image description here 2-你有“添加”什么错误记录 enter image description here enter image description here 确保对此跟踪条目使用较短的生命周期,以避免用日志文件淹没系统。IIS 将为每个调用生成一个单独的 xml 文件。 3-使用 Postman 或 Swagger 生成跟踪错误条目的错误请求。 从上一个屏幕,您可以选择“查看跟踪日志”,以带您到生成的日志文件。 用 Internet Explorer 打开错误的日志文件,并接受任何消息。 enter image description here 注意阻止你请求的来源。 enter image description here 7-禁用它在模块或映射处理程序 IIS 界面或在您的 web.config 中,如其他海报所示。

对于那些可怜的灵魂,寻找一种方法来获得一个简单的 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>