带有 Javascript 的 Dot Net Core Web API - CORS 策略错误

Posted

技术标签:

【中文标题】带有 Javascript 的 Dot Net Core Web API - CORS 策略错误【英文标题】:Dot Net Core Web API with Javascript - CORS policy error 【发布时间】:2021-07-31 09:23:02 【问题描述】:

我将 Visual Studio 代码与 liveserver 一起用于 html/javascript,并将 VS Studio 2019 用于 Dot net core Web API 我已经在 Windows 10 本地的 IIS 中为 web api 创建了站点。

    我有一个登录页面,接受用户 ID 和密码。 这是在 login.html 中编码的

登录页面有以下javascript函数,在登录按钮点击事件时调用

function fnlogin() 
   window.location.href = "http://localhost:5500/productmenu.html"

    登录后,会显示一个菜单页面。 这是在 productmenu.html 中编码的,带有以下内容
<header>
   <ul class = "nav">
     <li class="navlink"> <a href="productInfo.html> target="content"> Product Information <a> <li?
     <li class="navlink"> <a href="orderHistory.html> target="content"> Order History <a> <li?
   </ul>
</header>

    一旦用户选择菜单选项“产品信息”,就会显示另一个 html 页面 这是在 productinfo.html 中编码的

    一旦用户输入产品代码并点击搜索,就会调用一个dot net core web api,并使用fetch api将数据显示在productinfo.html中

该api在JS中调用如下

fetch('http://localhost:8082/api/product/' + productId)
.then(response => response(json))
.then((response => 
    return response
)
.then ( (response) => 
    console.log(response);
   )
.catch(err => console.log(err));
    dot net core web api 在 startup.cs 中有以下内容
method : configureServices

services.AddDefaultPolicy(
   options.AddDefaultPolicy (
      builder => 
      
           builder.WithOrigins("http://127.0.0.1:5500)
            .AllowAnyHeader()
            .AllowAnyMethod()
            .AllowCredentials()
      )
);

configure方法有如下

app.UseRouting();
app.UseCors();
app.UseAuthorization():

web api 发布在 IIS 中,端口为 8082

问题如下

    当我直接在浏览器中测试 web api 时,它可以正常工作 当我在实时服务器中运行 productmenu.html 时,会打开一个带有链接的新浏览器窗口 127.0.0.1:5500/productmenu.html 并显示菜单。选择“产品信息”菜单选项后,将显示页面产品信息页面。输入产品 ID 并单击搜索按钮后,将调用 Web api,然后正确显示产品信息。没问题.. 但是当我在 VS 代码/实时服务器中运行 login.html,并使用相同的步骤(如 #2 中所述)导航到产品信息页面并单击搜索按钮时,我在 Chrome 中收到以下 CORS 错误开发工具 “访问 .. from origin ... 已被 CORS 策略阻止:请求的资源上不存在 'Access-Control-Allow-Origin' 标头。”

我检查了 Chrome 开发工具中的网络选项卡并查看了请求标头

Accept: */*
Host: localhost:8082
Origin: http://localhost:5500
Sec-Fetch-Dest: Empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site : same-site

【问题讨论】:

【参考方案1】:

您在 Cors 语法中存在错误。这是默认策略的语法:

 services.AddCors(options =>
        
       options.AddDefaultPolicy(
         builder => 
      
           builder.WithOrigins("http://127.0.0.1:5500")
            .AllowAnyHeader()
            .AllowAnyMethod();
             );
        );

但如果还是不行,你可以尝试用命名策略替换默认的 Cors 策略


public void ConfigureServices(IServiceCollection services)
        
            services.AddCors(o => o.AddPolicy("AllowOrigins", builder =>
            
                builder.WithOrigins("http://localhost:5500")
                       .AllowAnyMethod()
                       .AllowAnyHeader();
            ));

        .....
            
        

        
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            .....

            app.UseRouting();
            app.UseCors("AllowOrigins");
           app.UseAuthorization();

            ....
         

【讨论】:

我目前正在使用默认策略。你是说我不能使用默认策略吗? Cors 非常棘手。我建议试试。如果有任何政策有效,您将非常幸运。 它工作了......谢谢......虽然不知道为什么默认策略不起作用 这很棘手。由于某些原因,命名策略在大多数情况下都有效,而默认策略则非常少见。

以上是关于带有 Javascript 的 Dot Net Core Web API - CORS 策略错误的主要内容,如果未能解决你的问题,请参考以下文章

Dot Net Core dll 作为带有事件的 COM dll

分析在 docker 容器上运行的 C# dot net 应用程序

支持 Dot Net 的构建服务器

c#和dot net。net是啥关系?

C# dot net core 单实例应用程序将参数传递给第一个实例

从 linux 的 dot net core 连接到远程 sql server 有时会失败,然后开始随机工作