解决ASP.NET Core Web Api跨域问题,CORS,No ‘Access-Control-Allow-Origin‘

跨域

在使用ASP.NET Core Web Api创建后端接口,前端使用这个接口的时候出现了这个错误,这是一个跨域的问题,我们查看网络请求看到也是一个CORS问题,这是因为浏览器基于安全考虑,默认是不能向其他域名发送网络请求,默认只能在接口所在域名发送网络请求。

 

我们这里需要配置一下跨域,打开Program.cs文件修改一下代码,这里我前端的域名是http://localhost:5174,我们将他配置到其中使其服务器接受这个域名的访问,然后我们将app.UseCors()添加到代码中,具体代码如下:需要服务器接受多个域名访问在大括号里添加域名即可。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddCors(i => i.AddDefaultPolicy(v =>
{
    v.WithOrigins(new string[] { "http://localhost:5174" }).AllowAnyMethod().AllowAnyHeader().AllowCredentials();
}));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseCors();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

AllowAnyOrigin()允许任意域名向我发送请求(虽然我们可以这样做,但是注意这种有安全隐患 慎用!) 

 WithOrigins(new string[] { "http://localhost:5174" })表示那些域名可以向我发送请求

AllowAnyMethod()允许任意类型请求

AllowAnyHeader()允许任意报文头

AllowCredentials()接受任意认证方式

同时微软在开发这个的时候,怕我们犯一些错误,所以当我们全部都设置为Allow的时候,如下这样:

builder.Services.AddCors(i => i.AddDefaultPolicy(v =>
{
    v.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials();
}));

如果我们全部都设置为这样,在运行的时候会抛出异常,也就是说微软不允许你全部使用Allow开头的方法,必须要有一项需要拦截一些请求。 

如下就是全部设置了Allow,会报这样的异常:

配置完跨域问题后,我们看一下前端现在能不能请求成功。

这是前端的请求代码,向后端发送一个post请求。

export function PostLogin(req){
	return request({
		method:'post',
				url:'/Login',
				headers: {'Content-Type': 'application/json'},
				data:req
	})
}

后端代码就是接受一个对象值,返回一个对象,定义的一个post请求。

[HttpPost]
public LoginReponse Login(LoginRequest req)
{
    Console.WriteLine(req.UserName);
    if (req.UserName == "admin" && req.Password == "123456")
    {
        var items = Process.GetProcesses().Select(x => new ProcessInfo(x.Id, x.ProcessName, x.WorkingSet64));
        return new LoginReponse(true, items.ToArray());
    }
    else
    {
        return new LoginReponse(true, null);
    }
}

 我们运行代码,可以看到,我们前端发送的请求成功了,状态码也是为200。

 

 这样前端报No 'Access-Control-Allow-Origin' header is present on the requested resource.的跨域问题我们就解决了。

.NET Core 3.1中,当你在前端发起一个请求时,如果没有在后端接口的响应头中设置'Access-Control-Allow-Origin',那么就会出现报错信息"has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource." 。 这是因为浏览器实施了同源策略,限制了请求。请求是指前端代码在一个名下发起请求,但是请求的目标地址与当前名不一致。而为了保护用户的安全,浏览器默认不允许这种请求,除非在服务器端设置了相应的响应头,即'Access-Control-Allow-Origin'。这个响应头指定了允许请求的源,可以是具体的名或者通配符"*"表示允许所有源。 解决这个问题的方法有几种: 1. 在后端代码中设置响应头,添加'Access-Control-Allow-Origin',并指定允许请求的源。例如,在.NET Core中可以通过使用CORS中间件来实现这个设置。在Startup.cs文件的ConfigureServices方法中,添加以下代码: services.AddCors(options => { options.AddPolicy("AllowAll", builder => { builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); 然后在Configure方法中,使用UseCors方法将该策略应用到所有请求上: app.UseCors("AllowAll"); 2. 如果只允许特定的名发起请求,可以在设置响应头时指定具体的名,而不是使用通配符"*"。 3. 如果你使用的是第三方的库或框架,例如jQuery,在发起请求时,可以通过设置xhrFields属性来添加'Access-Control-Allow-Origin'的请求头,例如: $.ajax({ url: 'http://localhost:52156/api/Person/1', type: 'GET', crossDomain: true, xhrFields: { withCredentials: true }, success: function (data) { console.log(data); } }); 通过以上的方法,你可以解决.NET Core 3.1报错"has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource."的问题。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [解决前后端报错:has been blocked by CORS policy: NoAccess-Control-Allow-Origin](https://blog.csdn.net/wsaicyj/article/details/127814374)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [asp.net core 3.1 解决问题](https://blog.csdn.net/qq_25086397/article/details/104412767)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值