调用 External WebApi 时出现“Access-Control-Allow-Origin”错误

Posted

技术标签:

【中文标题】调用 External WebApi 时出现“Access-Control-Allow-Origin”错误【英文标题】:Getting 'Access-Control-Allow-Origin' error when I call External WebApi 【发布时间】:2021-09-03 14:55:39 【问题描述】:

我找到了很多关于这个问题的页面,但没有一个解决方案有效。

我在调用 WebApi 方法 (C#) 的视图中有一个 javascript 按钮

            $('#btn-Sign-in', this).click(function () 

              var apiUrl = 'https://localhost:44391/api/test';
           fetch(apiUrl).then(response => 
           return response.json();
           ).then(data => 
           // Work with JSON data here
          console.log(data);
           ).catch(err => 
          // Do something for an error here
          );
          );

这是调用外部 api 的我的 Webapi 方法:

 [RoutePrefix("api")]
public class TestController : ApiBaseController

    [HttpGet]
    [Route("redirectforauth")]
    [RequiresPermission("Home:View")]

    [HttpGet]
    [Route("test")]
    [RequiresPermission("Home:View")]

    public async Task<IHttpActionResult> ConnectExternal()
    
        var request = new FlurlRequest("URL of an external website")
                     .SetQueryParam(...)
                     .SetQueryParam(...)
                     .SetQueryParam(...)
                     .SetQueryParam(...);

        var redirectUrl = request.Url.ToInvariantString();

        return  Redirect(redirectUrl);
    

当我运行项目时,我收到了这个错误:

 CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

【问题讨论】:

失败的不是对外部 API 的调用——来自 C# 的 http 请求不执行 CORS 检查(除非你明确要求这样做)——而是对https://localhost:44391/api/test 的调用——上面有按钮的 JS/ 页面大概不在localhost:44391 域上 【参考方案1】:

此错误是由于您的 Web 应用程序 URL 和 C# API URL 的来源不同(不在同一端口或同一主机上运行)。如果两个 URL 具有相同的方案、主机和端口,则它们具有相同的来源。

EX:您的 C# URL https://localhost:44391 与您的 Web 应用程序 URL 不同。

首先,为了确保您收到错误是由于您的 c# api 而不是由于外部 api,请在您的操作中注释掉您的外部 api 请求代码,然后直接从您的 api 返回一些内容到 Web 应用程序。 (如果错误来自外部 Api,则该外部 api 需要处理此问题以允许访问其他来源。)

如果您收到错误是由于您的 c# api 而不是由于外部 api,一种方法是在您的 C# WebApi 应用程序中启用 CORS。您可以为应用程序中的所有 Web API 控制器的每个操作、每个控制器或全局启用 CORS。

您可以在您的 C# API 应用程序中安装此 nuget 包:

Microsoft.AspNet.WebApi.Cors

在 App_Start/WebApiConfig.cs 中,将此代码添加到 WebApiConfig.Register 方法中:

config.EnableCors();

接下来,将 [EnableCors] 属性与您的 Web 应用程序 URL 添加到您的 TestController 类中。

例如:如果您的 Web 应用程序 URL 是 localhost:3000,请将其添加到 origins 中,如下所示。

[EnableCors(origins: "http://localhost:3000", headers: "*", methods: "*")]
public class YourController : ApiController 
    // Your methods...

现在来自您的 Web 客户端的 AJAX 请求应该可以工作了。 GET、PUT 和 POST 方法都是允许的。

有关如何启用 CORS 及其工作原理的更多详细信息: Enable cross-origin requests in ASP.NET Web API 2

【讨论】:

以上是关于调用 External WebApi 时出现“Access-Control-Allow-Origin”错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 ajax 调用 webapi get 方法时出现 405 错误

从角度访问webapi时出现401未经授权的错误

使用 Ajax 调用 Web Api 方法时出现错误 400

Postman调用动态o365 web api时出现403 Forbidden错误

通过 SSL 调用 Web Api 时出现 403 禁止错误

调用 Web API 2 端点时出现 HTTP 415 不支持的媒体类型错误