【问题标题】:GET and POST working but DELETE not on IIS 8.5 ServerGET 和 POST 工作,但 DELETE 不在 IIS 8.5 服务器上
【发布时间】:2015-05-26 20:59:14
【问题描述】:

我正在从 AngularJS 应用程序向 asp.net web api 发出删除请求,但出现以下错误 -

XMLHttpRequest cannot load http://api.prod.com/api/v1/proddetails/34. No   
'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://localhost:5100' is therefore not allowed access. The response     
had HTTP status code 403.

方法:

[HttpDelete]
public HttpResponseMessage Delete(int id)

网络配置:

<system.webServer>
<validation validateIntegratedModeConfiguration="false" />

<modules runAllManagedModulesForAllRequests="true">
  <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
  <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
  <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
  <remove name="WebDAVModule" />
</modules>

<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="12582912" />
    <!--12 MB-->
  </requestFiltering>
</security>
<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <remove name="WebDAV" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

请帮忙。

注意:该机器是在 AWS EC2 上运行 IIS 8.5 的 Windows Server 2012 R2。我在控制器上像这样正确设置了 CORS -

[EnableCors(origins: "*", headers: "*", methods: "*")]

编辑1

我正在查看我的 applicationHost.config 文件,它有这些行 -

<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\windows\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" modules="IsapiModule" scriptProcessor="C:\windows\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" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

但是它们太多了,而且没有一个将 DELETE 作为允许的动词。这会导致问题吗?

编辑2

根据要求,这是 AngularJS 请求代码 -

$http.delete('http://api.prod.com/api/v1/proddetails/' + data)
                .success(function (data, status, headers, config) {
                    console.log(data);
                    if(data.status == "200")
                    {
                        console.log('data deleted');
                    }
                    deferred.resolve(data);
                })
                .error(function (data, status, headers, config) {
                    console.log("some error occurred");
                    deferred.reject(data);
                });

【问题讨论】:

  • 可能由于其他原因您收到 500 内部服务器错误,请尝试更好地调查服务器上发生的情况,有时“Access-Control-Allow-Origin”错误会产生误导
  • 我在本地主机上尝试了相同的代码,它可以工作,但在生产中失败。 OPTIONS 请求为 200 OK,但 DELETE 请求为 403 Access Denied on production。
  • 差异可能是您本地环境中的模型与生产环境中的模型不同,因此,在生产环境中您没有删除记录的权限
  • 请求甚至没有到达端点。我是本地和产品的管理员,并提供了所有访问权限。我在想,由于产品在 AWS EC2 上,可能存在一些防火墙问题。

标签: asp.net-mvc angularjs iis asp.net-web-api amazon-ec2


【解决方案1】:

尝试更改 Web.config 的此属性:

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

【讨论】:

    【解决方案2】:

    这里可能会发生两件事。

    第一

    在 IIS 中,如果您单击最根节点(计算机名称),您可以在右侧框架的管理下看到一个名为“功能委托”的图标。双击打开它。从那里,您将看到委托列表,找到处理程序映射并确保将其设置为读/写。这将允许站点覆盖可能不允许删除动词的默认处理程序。然后确保 web.config 反映了您希望为 extensionlessurlhandler 启用的动词。

    第二

    您必须像这样在 API 控制器上实现选项动词:

    [HttpOptions, AllowAnonymous]
    public IHttpActionResult Options()
    {
        return StatusCode(HttpStatusCode.OK);
    }
    

    这是因为 CORS 将“预先发送”许多不是简单获取或发布的请求。

    来自有关该主题的 Mozilla 文档:

    预检请求

    与简单的请求(上面讨论过)不同,“预检”请求首先 通过 OPTIONS 方法向资源上的资源发送 HTTP 请求 其他域,以判断实际请求是否安全 发送。跨站点请求是这样预检的,因为它们可能 对用户数据有影响。特别是,请求是 预检如果:

    它使用 GET、HEAD 或 POST 以外的方法。此外,如果 POST 用于 发送 Content-Type 以外的请求数据 application/x-www-form-urlencoded、multipart/form-data 或 text/plain, 例如如果 POST 请求使用 application/xml 或 text/xml,然后预检请求。

    它在请求中设置自定义标头(例如,请求使用标头 比如X-PINGOTHER)

    此外,本地主机可能存在 CORS 问题。有一些解决方法可供开发,请参阅:

    Deadly CORS when http://localhost is the origin

    【讨论】:

    • 它没有解释为什么 GET 和 POST 有效而 DELETE 无效。因为 POST 也发送飞行前请求。请参阅Edit1。
    • 我认为您的编辑不是问题。 Post 仅在某些条件下发送预飞行。你实现了选项动词吗?如果不是,无论如何都需要它,所以我们应该尝试一下。
    • 你能用 fiddler 看请求吗?最好知道正在发送什么以及错误何时真正回来,因为它可能来自选项或删除方法。选项方法的匿名部分也很重要,它不会向那个发送身份验证
    • OPTIONS 请求为 200 OK,带有 Access-Control-Request-Header:accept、授权和 Access-Control-Request-Method:DELETE。但实际的 DELETE 请求会抛出 403 Access Denied。
    • 你能把请求的javascript贴出来吗?
    【解决方案3】:

    在您的applicationHost.config 文件中更改以下标记:

    <add name="ExtensionlessUrlHandler-Integrated-4.0" 
         path="*." 
         verb="GET,HEAD,POST,DEBUG, DELETE" 
         type="System.Web.Handlers.TransferRequestHandler" 
         preCondition="integratedMode,runtimeVersionv4.0" 
         responseBufferLimit="0" />
    

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 1970-01-01
      • 2022-01-16
      • 2020-12-08
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      相关资源
      最近更新 更多