我最近从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?
答案 0 :(得分:156)
好。我终于到底了。你需要跳过一些箍来让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删除请求,则默认情况下,您的方法应命名为“删除”。
答案 1 :(得分:112)
更改您的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>
答案 2 :(得分:60)
删除 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修复它,如果应用程序托管在另一台机器上,它就不会发生
答案 3 :(得分:42)
更新您的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>
无需修改主机配置。
答案 4 :(得分:16)
在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>
答案 5 :(得分:5)
这对我在iis8上的工作以及其他一些答案。我的错误是404.6具体
<system.webServer>
<security>
<requestFiltering>
<verbs applyToWebDAV="false">
<add verb="DELETE" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
答案 6 :(得分:5)
只是对可能遇到此问题的其他任何人的快速更新。截至今天,更改%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>
答案 7 :(得分:4)
启用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
答案 8 :(得分:4)
在没有任何效果之后,我能够通过以下步骤解决这个问题:
•安装IIS时未选择“WEB DAV PUBLISHING”IIS设置。 •INETMGR - 默认网站 - 请求过滤 - HTTP动词 - PUT为True
答案 9 :(得分:3)
在无休止地搜索并尝试已经提供的答案(添加PUT,DELETE动词并删除WEBdav)之后,它只是无法正常工作。
我去了IIS日志记录设置:&gt;查看日志文件。在我的情况下,W3SVC4是具有最新日期的文件夹,打开文件夹,查找最新的日志文件并看到此条目: GET / Rejected-By-UrlScan~ / MYDOMAIN / API / ApiName / UpdateMETHOD
Update方法列出了动词GET,奇怪吧?所以我用Google搜索了Rejected-By-UrlScan并找到了这个链接:UrlScan Broke My Blog。
我去了这里:%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)
答案 10 :(得分:3)
对于PHP,它只是:
我想这也适用于其他处理程序。
答案 11 :(得分:2)
除上述所有解决方案外,请检查您是否拥有&#34; ID &#34;或者DELETE方法中的任何自定义参数都匹配路由配置。
public void Delete(int id)
{
//some code here
}
如果你遇到重复的405错误,最好将方法签名重置为默认值,然后尝试。
默认情况下,路线配置会在网址中查找 id 。因此,除非您在 App_Start 文件夹下更改路径配置,否则参数名称 id 非常重要。
您可以更改 id 的数据类型。
例如,下面的方法应该可以正常工作:
public void Delete(string id)
{
//some code here
}
注意:还要确保通过网址传递数据,而不是将有效负载作为正文内容传输的数据方法。
DELETE http://{url}/{action}/{id}
示例:
DELETE http://localhost/item/1
希望它有所帮助。
答案 12 :(得分:1)
我在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" />
答案 13 :(得分:1)
我不确定您是否编辑了正确的配置文件。请尝试以下步骤
打开%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"
/>
答案 14 :(得分:1)
我也遇到过同样的问题,然后解决了,
这是解决方案,希望它可以为您提供帮助
首先
在IIS modules
配置中,循环 WebDAVModule ,如果您的Web服务器拥有它,则将其删除
第二
在IIS handler mappings
配置中,您可以看到启用处理程序的列表,选择the PHP item
,对其进行编辑,在编辑页面上,单击“请求限制”按钮,然后选择the verbs tab
在情态中,在指定要处理的动词标签中,选中all verbs radio
,然后单击“确定”,您可能还会看到一条警告,它向我们展示了对PHP-CGI执行使用双引号,然后执行此操作
如果完成,然后重新启动IIS服务器,就可以了
答案 15 :(得分:1)
以下是使用IIS管理器GUI允许额外HTTP谓词的方法。
在IIS管理器中,选择您希望允许PUT或DELETE的站点。
点击&#34;请求过滤&#34;选项。点击&#34; HTTP动词&#34;标签
点击&#34;允许动词...&#34;侧边栏中的链接。
在出现的框中键入&#34; DELETE&#34;,单击“确定”。
点击&#34;允许动词...&#34;再次在侧栏中链接。
在显示类型&#34; PUT&#34;的框中,单击“确定”。
答案 16 :(得分:0)
在IIS 8.5 / Windows 2012R2中,这里没有提到任何内容。 我不知道删除WebDAV是什么意思,但我没有解决这个问题。
以下步骤对我有所帮助;
现在一切正常。
答案 17 :(得分:0)
另一个原因可能如下:
我根据this answer更改了我的Url for Web Api方法:
Url.Action("MyAction", "MyApiCtrl", new { httproute = "" })
但是这种方法可以创建如下链接:
/api/MyApiCtrl?action=MyAction
这适用于GET和POST请求,但不适用于PUT或DELETE。
所以我只用以下代替它:
/api/MyApiCtrl
它解决了这个问题。
答案 18 :(得分:-1)
您可以将Delete方法转换为POST为;
[HttpPost]
public void Delete(YourDomainModel itemToDelete)
{
}