IIS服务器上.NET Core API+Angular+SignalR项目CORS错误排查求助
配置错误原因
- 源匹配规则使用了错误的占位符:你当前CORS策略中
SetIsOriginAllowed的判断条件为new Uri(origin).Host == "server name",这里的"server name"是未替换的占位符,实际部署后你的前端源为http://server,对应Host值是server,和配置的匹配值不一致,直接导致CORS策略匹配失败,不会返回跨域响应头,这也是本地调试正常、部署后出错的核心原因——本地调试时你大概率启用了注释里的SetIsOriginAllowed(_ => true)允许所有源,自然不会触发跨域限制。 - 全局授权过滤器拦截了CORS预检请求:CORS的OPTIONS预检请求不会携带Windows身份凭证,你配置了全局要求身份认证的过滤器,会直接拦截预检请求,导致跨域响应头无法返回。
- 源配置格式错误:你注释的
WithOrigins配置中写了http://server/fareg,但跨域规则的源仅包含协议、域名、端口三部分,路径不属于源的内容,填写路径会导致匹配失效。
修复步骤
1. 修正跨域源匹配规则
两种配置方式二选一即可:
方式A:固定允许的源(更安全,推荐)
直接用WithOrigins明确指定允许的前端地址:
services.AddCors(options => { options.AddPolicy(name: _MyCors, builder => { builder .WithOrigins("http://server", "http://localhost:4200") .AllowCredentials() .AllowAnyHeader() .AllowAnyMethod(); }); });
方式B:动态匹配Host
如果需要动态匹配同Host的所有源,把占位符替换为实际的Host值:
.SetIsOriginAllowed(origin => new Uri(origin).Host == "server")
2. 放行CORS预检OPTIONS请求
在Configure方法中UseCors之后添加如下中间件,优先处理OPTIONS预检请求,避免被全局授权拦截:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseCors(_MyCors); // 新增:放行OPTIONS预检请求 app.Use(async (context, next) => { if (context.Request.Method == "OPTIONS") { context.Response.StatusCode = 200; await context.Response.CompleteAsync(); return; } await next(); }); // 其余原有配置保持不变 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } app.UseHttpsRedirection(); app.UseSignalR(routes => { routes.MapHub<Hubs.HubFA>("/signalr"); }); app.UseMvc(); }
3. 验证配置生效
部署后清空浏览器缓存再测试,如果仍有报错,可以在服务器上用浏览器直接访问后端API地址,确认服务正常启动、端口没有被防火墙拦截。
内容的提问来源于stack exchange,提问作者Ruben Martinez
相关产品推荐
相关产品推荐

