Angular/.NET Core项目上的Cors问题



我无法从http请求中获取数据。在服务器端,我有以下

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen();
services.AddScoped<IRepository, Repository>();
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddCors(options => 
options.AddDefaultPolicy(builder => builder
.WithOrigins("http://localhost:4200")
.AllowAnyMethod().AllowAnyHeader().AllowCredentials()));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "KYCDB API");
});
app.UseHttpsRedirection();
app.UseRouting();
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}

该项目还启用了windows身份验证,关闭了匿名身份验证

"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress": {
"applicationUrl": "http://localhost:51721",
"sslPort": 49321
}
}

在角度方面,我得到了一个组件

export class HeaderComponent implements OnInit {
currentEmployee$: Observable<Employee>;
constructor(private userService: UserService) { }
ngOnInit(): void {
this.currentEmployee$ = this.userService.getCurrentEmployee();
}
}

和拦截

@Injectable()
export class ApiInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
req = req.clone({ withCredentials: true });
return next.handle(req);
}
}

当页面加载时,我得到2个警告和一个错误

警告:跨来源请求被阻止:同源策略不允许读取上的远程资源http://localhost:51721/employee/current.(原因:缺少CORS标头"Access Control Allow Origin"(。

警告:跨来源请求被阻止:同源策略不允许读取上的远程资源http://localhost:51721/employee/current.(原因:CORS请求未成功(。

错误:的Http失败响应http://localhost:51721/employee/current:0未知错误

我需要纠正什么?

很抱歉,这是一个难题,可能有很多原因导致它不起作用,但我遇到了类似的问题,并通过更改Configure((函数中的cors调用来解决它。Configure((函数是在运行时调用的get,它充当http请求管道,因此在某些情况下执行顺序很重要(https://learn.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-3.1#配置方法(

您可以尝试以下操作:

更改电流:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "KYCDB API");
});
app.UseHttpsRedirection();
app.UseRouting();
app.UseCors(); // Move this
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}

收件人:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{

if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "KYCDB API");
});
app.UseRouting();
app.UseCors(); // Here
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}

因此,http管道中的第一个操作将是验证cors。我认为这是一个公平的选择,因为从你的问题来看,听起来你没有得到应用程序初始化错误,而是得到了运行时客户端请求时间错误。我不确定这是否能解决问题,但也许它会有所帮助!

最新更新