.NET Core GraphQL服务CORS跨域问题求助:预检请求未通过检查
.NET Core GraphQL服务CORS预检失败问题修复方案
问题根源
你的CORS策略仅开放了GET方法,但GraphQL的变更(Mutation)请求用的是POST,而且浏览器发起的预检OPTIONS请求也未被允许,加上WithOrigins("React Url")是占位符未替换为真实的React应用地址,这才导致了跨域拦截。
修复步骤
1. 修正CORS策略配置
更新AddCors的规则,覆盖GraphQL所需的请求方法,并替换为实际的React应用地址:
var policyName = "_myAllowSpecificOrigins"; var builder = WebApplication.CreateBuilder(args); builder.Services.AddCors(options => { options.AddPolicy(name: policyName, builder => { // 替换为你的React应用真实地址,多源用逗号分隔 builder.WithOrigins("http://localhost:3000") // 允许GraphQL常用请求方法 .WithMethods("GET", "POST", "OPTIONS") .AllowAnyHeader(); }); });
2. 确保中间件顺序正确
当前你的中间件顺序没问题,保持UseCors在UseRouting之后、UseAuthentication/UseAuthorization之前即可。
3. 为GraphQL端点强制绑定CORS策略(可选)
如果全局策略未生效,可在映射GraphQL端点时明确指定使用的CORS策略:
app1.UseEndpoints(endpoints => { endpoints.MapGraphQL().RequireCors(policyName); endpoints.MapControllers().RequireCors(policyName); });
4. 检查IIS Express配置
确认项目launchSettings.json中的应用URL正确,若启用HTTPS,React应用的请求地址也要对应使用https://协议,避免协议不匹配导致的跨域问题。
生产环境注意事项
- 禁止使用
AllowAnyOrigin,必须指定明确的可信源地址,防止安全风险。 - 确保
WithOrigins配置的地址和React应用的请求地址完全一致(包括协议、域名、端口,不要带末尾斜杠)。
内容的提问来源于stack exchange,提问作者Cors Help
相关产品推荐
相关产品推荐

