ASP.NET Core 3.1 API CORS问题:IIS Express正常IIS环境报错如何解决?
问题原因与解决方案
疑问1:为什么开发环境运行正常,部署到IIS就需要额外配置CORS?
开发环境使用的IIS Express默认会将所有请求(包括CORS预检的OPTIONS请求)完整转发给ASP.NET Core中间件处理,你在Startup中写的CORS配置可以正常生效。而正式IIS默认会优先拦截OPTIONS预检请求,不会转发到你的应用程序,导致Startup里的CORS逻辑完全没有执行的机会,自然不会返回正确的CORS头,第一次就会报缺少Allow-Control-Allow-Origin的错误。
疑问2:为什么IIS上CORS似乎只允许单个域名,CORS的设计初衷不就是支持多源访问吗?
这不是CORS或者IIS的限制,是错误配置导致的:你直接在web.config的自定义响应头里写死了固定的单个域名https://MYDOMAIN,完全绕过了ASP.NET Core中支持多源判断的CORS逻辑,才会看起来只支持单个域名。正常通过ASP.NET Core中间件配置的CORS是完全支持多源访问的。
疑问3:该如何解决当前的CORS报错问题?
按照以下步骤修改即可:
- 第一步:删除web.config中你之前添加的所有
<httpProtocol><customHeaders>下的CORS相关配置,这部分配置会和应用的CORS逻辑冲突,导致重复返回头或者逻辑被覆盖。 - 第二步:调整Startup.cs中中间件的顺序,确保
UseCors放在UseRouting之后、UseAuthentication/UseAuthorization之前,正确的配置示例如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); // CORS配置必须放在这个位置 app.UseCors(builder=>{ builder.SetIsOriginAllowed(origin => true) // 排查问题阶段可以临时全放行,生产环境替换为你的域名校验逻辑 .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); }); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
- 第三步:修改web.config配置,让IIS将OPTIONS请求转发给ASP.NET Core处理,不要拦截,修改后的system.webServer段示例如下:
<system.webServer> <modules runAllManagedModulesForAllRequests="false"> <!-- 移除IIS自带的CORS模块,避免和应用逻辑冲突 --> <remove name="CorsModule" /> </modules> <handlers> <remove name="aspNetCore"/> <!-- verb设置为*,让ASP.NET Core模块处理所有类型的请求,包括OPTIONS --> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <!-- 此处保留你原有aspNetCore节点的配置,不需要修改 --> <aspNetCore processPath="dotnet" arguments=".\你的应用.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /> </system.webServer>
- 第四步:重启IIS站点,验证CORS逻辑已经正常生效。
内容的提问来源于stack exchange,提问作者Lee Arnould
相关产品推荐
相关产品推荐

