ASP.NET Web API - 不允许PUT和DELETE动词 - IIS 8

Mar*_*ark 141 asp.net iis asp.net-web-api iis-8

我最近从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?

Mar*_*ark 158

好的.我终于到底了.你需要跳过一些箍来让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" />
Run Code Online (Sandbox Code Playgroud)

至:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Run Code Online (Sandbox Code Playgroud)

除上述内容外,您还应确保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" />
Run Code Online (Sandbox Code Playgroud)

另请注意,默认Web API约定是您的方法名称应与调用的HTTP谓词相同.例如,如果您要发送HTTP删除请求,则默认情况下,您的方法应命名为"删除".

  • 对于IIS8上OPTIONS动词的类似问题(在处理程序之前还有其他内容被拦截),请在web.config中尝试<remove name ="OPTIONSVerbHandler"/>.就此而言,作为一般规则,我建议在本地web.config中使用"remove"技术而不是使用applicationhost.config. (9认同)
  • 而不是在服务器级别删除可能具有连锁效应的WebDAV,最好将其从项目中删除,如下所示:http://stackoverflow.com/a/14465655/428280 (7认同)
  • 即使在开发机器上,指示修改系统设置的答案也不能成为答案.这解决了一个症状,并没有真正帮助团队和生产.你会在每台机器上复制这个吗?看看Santosh Sah的回答. (3认同)

小智 120

更改您的Web.Config文件,如下所示.它会像魅力一样.

在节点中<system.webServer>添加下面的代码部分

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>
Run Code Online (Sandbox Code Playgroud)

添加后,您的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>
Run Code Online (Sandbox Code Playgroud)

  • 每当我看到它时,它会让我内心死亡 - runAllManagedModulesForAllRequests ="true" - 作为解决方案http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html (7认同)
  • 保存了我的一天:<modules runAllManagedModulesForAllRequests ="true"> <remove name ="WebDAVModule"/> </ modules> (6认同)
  • 删除WebDavModule是解决此问题的正确方法. (3认同)
  • 不应该需要自定义标头,因为它们与CORS有关,这样你就会引发安全漏洞.关于`WebDAVModule`的部分是相关的. (3认同)
  • 这个答案是正确的,唯一的例外是处理程序名称可能因 IIS 版本而异 - 例如 7.5 使用“ExtensionlessUrlHandler-Integrated-4.0”(如上面的答案),而 IIS 8.5 将其重命名为“ExtensionlessUrl-Integrated- 4.0"`([Mark S.] 也提到了(http://stackoverflow.com/questions/10906411/asp-net-web-api-put-delete-verbs-not-allowed-iis-8/10907343#10907343 ) 处理程序的名称显示在 IIS 错误页面中,一旦您收到错误,因此知道设置哪个应该很简单。我使用这两个名称是为了支持不同的托管环境。 (2认同)
  • *注意*:上述代码中的自定义标题部分允许*ANY*网站从浏览器调用您的API - 这是一个很大的安全风险*.阅读CORS,它实际上就是那些标题所启用的功能. (2认同)

Pet*_*ang 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>
Run Code Online (Sandbox Code Playgroud)

通过web.config解决问题总是更好,而不是通过iis或machine.config修复它,如果应用程序托管在另一台机器上,它将不会发生

  • 删除WebDAVModule为我工作,无需删除处理程序WebDAV(IIS 8.0). (4认同)
  • 只是删除webdav在框架4.6.2 iis8.5上工作 (3认同)

Chr*_*sic 44

更新您的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>
Run Code Online (Sandbox Code Playgroud)

http://odetocode.com/blogs/scott/archive/2012/08/07/configuration-tips-for-asp-net-mvc-4-on-a-windows.aspx

无需修改主机配置.


Gan*_*esh 17

在Asp.Net Web API中 - webconfig.这适用于所有浏览器.

在System.web标记内添加以下代码

<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>
Run Code Online (Sandbox Code Playgroud)

用以下代码替换您的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>
Run Code Online (Sandbox Code Playgroud)

  • **注意**:上述代码中的自定义标题部分允许__ANY__网站从浏览器调用您的API - 这是一个很大的安全风险**.阅读CORS,这有效地解决了这些标头的问题. (38认同)

zok*_*mid 6

启用 CORS(漂亮又整洁)

1.添加CORS nuget包

Install-Package microsoft.aspnet.webapi.cors
Run Code Online (Sandbox Code Playgroud)

2.在WebApiConfig.cs文件中的Register方法中添加以下代码:

config.EnableCors();
Run Code Online (Sandbox Code Playgroud)

例如:
使用 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 }
        );           
    }
}
}
Run Code Online (Sandbox Code Playgroud)

3.将以下代码添加到控制器的命名空间中,包括 get、post、delete、put 或任何 http 方法

[EnableCors(origins: "The address from which the request comes", headers: "*", methods: "*")]
Run Code Online (Sandbox Code Playgroud)

前任:

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);
    }       
}
}
Run Code Online (Sandbox Code Playgroud)

参考:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api


Sic*_*ico 5

这对iis8和其他一些答案都适用.我的错误是404.6具体

<system.webServer>
  <security>
  <requestFiltering>
    <verbs applyToWebDAV="false">
       <add verb="DELETE" allowed="true" />
    </verbs>
  </requestFiltering>
  </security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)


Har*_*ari 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>
Run Code Online (Sandbox Code Playgroud)


Fra*_*rte 5

对于 PHP,很简单:

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

我想这也适用于其他处理程序。