ajax调用后如何绕过CORS将错误冒泡回客户端

Posted

技术标签:

【中文标题】ajax调用后如何绕过CORS将错误冒泡回客户端【英文标题】:How Can I bypass CORS to bubble an error back to the client after an ajax call 【发布时间】:2019-04-30 10:50:47 【问题描述】:

我有一个带有donefail 腿的ajax 调用:

$.ajax(
            url: apiUrl + "/auth/sign-in",
            type: "POST",
            dataType: "text",
            data: loginFormData,
            contentType: "application/x-www-form-urlencoded",
            crossDomain: true,
            headers: "Access-Control-Allow-Origin": "*"

        )…..

以及以.fail(function (xhr, status, error) 形式声明的fail函数

在我的startup.cs文件中添加CORS服务时,我是这样设置的:

services.AddCors(options =>
        
            options.AddPolicy("CorsPolicy", builder =>
                 builder.AllowAnyOrigin().AllowCredentials()
                .WithMethods("GET", "POST", "HEAD")
                .WithHeaders("Acccept", "Accept-Language", "Content-Language", "Content-Type", "Last-Event-ID")
                .Build());
        );

在我的 Web Api 方法中,我返回一个错误:

 Exception inner = new Exception  Source = "WebApi: Authorisation" ;
 throw new UnauthorizedAccessException("You must login",inner);

代码退回到 ajax 调用的失败函数中,但错误为空。在浏览器(Chrome)中,我收到以下错误:

从源“http://localhost:54979”访问“http://localhost:54981/auth/sign-in”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头出现在请求的资源上。

【问题讨论】:

还需要允许 OPTIONS 方法。您的 POST 将在发送实际 POST 之前由浏览器生成预检 OPTIONS 请求。在请求中设置访问控制标头也无用 【参考方案1】:

当存在未捕获的异常时,ASP.NET 不会发送 CORS 标头。您必须对其进行配置。

在 github 上查看以下问题评论:https://github.com/aspnet/AspNetCore/issues/2378#issuecomment-354673591

另外,您正在发送标头

 "Access-Control-Allow-Origin": "*"

从客户端到服务器,这是错误的。它应该从服务器发送到客户端。

【讨论】:

我最初没有在我的 Ajax 调用中设置任何标头,CORS 仅从我的启动文件中设置,但我仍然收到此错误。我如何将它添加到从服务器引发的异常中? ajax 请求中的 cors 标头与您的错误无关。这是错误的。 所以我从 ajax 请求中删除了 headers 属性。正如您从我原来的问题中看到的那样,在服务器端我正在添加标题,但我仍然得到同样的错误。不知道为什么有人想对我的问题投反对票。这对我来说是一个有效的问题,我已经展示了我的代码并且我进行了研究,但没有找到一个有效的工作示例来说明我应该做什么。

以上是关于ajax调用后如何绕过CORS将错误冒泡回客户端的主要内容,如果未能解决你的问题,请参考以下文章

Postman(一个电子应用程序)如何绕过 CORS?

球衣后端 jquery AJAX API 调用中的 Cors 策略阻塞

AWS CORS 问题:即使在获得 200 状态代码后,Ajax 响应也会出现错误

如何绕过访问控制允许来源?

如何绕过访问控制允许来源?

如何绕过访问控制允许来源?