跨域

在使用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.的跨域问题我们就解决了。

更多推荐