ASP.NET Core Web Api 发送 Access-Control-Allow-Origin: null CORS header and chrome 出错,如何解决?

Posted

技术标签:

【中文标题】ASP.NET Core Web Api 发送 Access-Control-Allow-Origin: null CORS header and chrome 出错,如何解决?【英文标题】:ASP.NET Core Web Api sending Access-Control-Allow-Origin: null CORS header and chrome is erroring, how to fix? 【发布时间】:2018-08-24 07:39:57 【问题描述】:

昨天我设法让我的 API 在我的本地计算机上工作,但是今天(相同的代码)在另一台计算机上,它不工作,我在控制台上收到此错误:

无法加载http://localhost:52056/api/task: “Access-Control-Allow-Origin”标头的值“null”不是 等于提供的原点。因此不允许使用 Origin 'null' 访问。

这是 Chrome 上的 http 请求和响应:

(我在 IE/Firefox 中看不到错误)

这是我的启动类(使用 .net core 2)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using TodoApi;

namespace TestCors

    public class Startup
    
        public Startup(IConfiguration configuration)
        
            Configuration = configuration;
        

        public IConfiguration Configuration  get; 

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        
            services.AddSingleton<ITaskWarehouse, TaskWarehouse>();

            services.AddCors();
            services.AddMvc();
        

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            

            app.UseCors(builder => builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials());
            app.UseMvc();
        
    

这里有什么问题? 代码和昨天一样,但是我在 Windows 10 上运行,这台机器有 Windows 7。 有什么想法吗? 谢谢

【问题讨论】:

您是否只是在浏览器中打开发出 ajax 请求的 html 页面,而没有任何服务器(所以通过双击它)? A null Access-Control-Allow-Origin is a known exploit 所以我猜 chrome 已经做了正确的事情,并且在其他浏览器还没有(还)的地方进行了修补。你把它改成什么取决于你真正想要它做什么。我猜你想要* 这是一个有效值 嗨@Evk,是的,我只是双击磁盘文件中的html文件,它有javascript代码来发出http请求,使用javascript框架库(骨干网)。这是一个问题? 如何让它有 * 而不是 null @Liam ?我在 web api 的配置方法上配置了 AllowAnyOrigin,难道这还不足以让 * 响应而不是 null 吗? 我不确定 TBH,我不使用这项技术,maybe WithOrigins("*") 但这是猜测 TBH 【参考方案1】:

尝试删除

.AllowCredentials()

CORS 不允许您将 .AllowCredentials().AllowAnyOrigin() 用于同一策略。我不明白为什么它可以在不同的机器上工作。

这是来自ASP.NET页面

CORS 规范还指出,将来源设置为“*”是无效的,如果 SupportsCredentials 为 true。

【讨论】:

成功了,非常感谢!另一台机器有不同的操作系统和不同的 chrome 版本,也许它让事情以某种方式工作 xD CORS 不允许这样做是的,但是 asp.net 核心足够聪明来处理它。如果您同时指定两者 - 它将在响应标头中返回请求来源而不是“*”(就像有问题的屏幕截图一样)。【参考方案2】:

问题是您正在打开 html 页面,只需双击它即可发出此请求,而无需使用服务器。所以浏览器中的 url 是“file:///...”。这意味着没有来源,正如您在问题的屏幕截图中看到的那样 - CORS 请求具有“Origin:null”标头。不同的浏览器以不同的方式处理这种情况。 Chrome 会限制来自此类来源的跨域请求,即使响应允许(通过将“null”作为“Access-Control-Allow-Origin”返回)。

所以要修复 - 使用适当的服务器(本地服务器),或使用其他浏览器进行开发。也有人声称像这样启动 chrome

chrome.exe --allow-file-access-from-files

也应该“解决”这个问题,虽然我自己没有尝试过。

更新:我的印象是,即使使用 Access-Control-Allow-Origin: * chrome 也不会允许它,但您对其他答案的评论似乎另有主张(通过删除 AllowCredentials() 您做出回应以使用“*”作为允许的来源而不是请求中提供的来源)。如果是这样 - 这是修复它的另一种方法(不确定,也许它在不同的 chrome 版本中表现不同)。

【讨论】:

是的,我的浏览器正在使用“file:///...”,我可以问你一个简单的问题吗?如果我只需要运行这个 html 文件,那么使用合适的服务器(本地服务器)有什么好处?我应该只使用 nodejs 来提供这个单一的 html 吗? @TiagoM 在这种情况下很好,它确保您的 CORS 请求将在 chrome 中运行 :) 我只是不知何故从未将原始 html 文件分发给客户,但当我想到这一点时 - 为什么不确实如此.另一方面,您将失去 Web 的所有好处,例如轻松更新(我的意思是,如果您运行的不是本地而是常规的远程 http 服务器)。所以,取决于你的情况。 有道理,因为这只是一个简单的面试练习,我并没有经历配置合适服务器的所有麻烦,但也许我应该这样做以获得最佳实践,nodejs 容易吗配置只是为了提供一个 html 页面?我的意思是,我仍然需要配置所有路由等等? 您可以使用这个问题来查看如何为单个文件运行 nodejs:***.com/q/35995273/5311735。很容易。但是为什么不从您用于 api (localhost:56052) 的同一台服务器上提供 html 文件呢?作为奖励,您不会有 CORS 问题。 感谢您的链接,我会检查一下!虽然我也是这样,但由于我从命令行使用 typescript/webpack,我认为将 Visual Studio 加入到混合中会是过度杀戮哈哈。

以上是关于ASP.NET Core Web Api 发送 Access-Control-Allow-Origin: null CORS header and chrome 出错,如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net core 3 Web API !发送 json 到 POST 动作

从角度12将类对象发送到asp.net core web api http get方法

如何使用 fetch 将 FormData 从 javascript 发送到 ASP.NET Core 2.1 Web API

处理 ASP.NET Core Web API 对象属性绑定

如何在 ASP .NET Core Web API 中映射回退,以便 Blazor WASM 应用程序仅拦截未发送到 API 的请求

ASP.NET Core Web API DELETE 调用返回 405