Angular9调用ASP.NET Web API偶发CORS跨域500报错求助
报错信息
Access to XMLHttpRequest from origin has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
问题根因
这个偶发跨域提示是假象,本质是接口处理特定入参时抛出未捕获的500异常,ASP.NET Web API在异常响应阶段没有正确追加CORS响应头,导致浏览器把真实服务端错误识别为跨域拦截。
正常入参时接口逻辑跑通,响应能正常带上CORS头,所以请求正常;特定入参触发异常时,请求在管道中异常退出,没走到CORS头写入逻辑,就会触发你看到的报错。
现有代码的高风险触发点
- 参数转换无校验:接口中直接使用
Convert.ToDouble(markup)、Convert.ToDouble(userTier2Markup)做类型转换,当参数为空、传入非数字格式值时,会直接抛出FormatException触发500错误。 - 返回值序列化失败:如果
ISM.SelectOutput给output赋值了存在循环引用、无法被JSON序列化的对象,Web API在序列化返回值阶段会抛出异常,这个阶段的异常不会经过常规Action层的逻辑,自然不会带上你在Action里加的CORS头。 - CORS配置位置错误:从你贴的代码看,目前只贴了MVC路由的
RouteConfig配置,如果你把CORS逻辑写在MVC管道、或者Action过滤器/接口业务逻辑里,一旦请求在进入Action前抛出异常、或者Action执行时报错,CORS头就不会被写入响应。
排查&修复方案
- 先拿到真实错误信息
打开浏览器F12网络面板,定位到报错的请求,直接查看响应正文内容,不要参考控制台的跨域提示,响应正文里会有完整的500错误堆栈,能直接定位具体报错的代码行。也可以在服务端加全局异常日志,记录所有500请求的错误信息。 - 修复参数转换的风险
替换直接用Convert.ToDouble的逻辑,增加类型校验,避免非法入参直接抛未处理异常:if (!double.TryParse(markup, out double markupVal) || !double.TryParse(userTier2Markup, out double userTier2Val)) { return BadRequest("markup、userTier2Markup必须传入合法数字"); } ISM.SelectOutput(ref output, product, currency, markupVal, userTier2Val, projectInfo.ExchangeRate); return Ok(output); - 修正CORS配置位置,保证所有响应(含错误响应)都带跨域头
不要在单个Action或者MVC管道里配置CORS,使用Web API官方的CORS包,把CORS注册放在Web API管道的最开头,保证哪怕请求抛异常,CORS模块也能正常给响应追加头:
首先Nuget安装Microsoft.AspNet.WebApi.Cors包,然后在WebApiConfig中做如下配置:
注意不要把Web API的CORS配置写到MVC的public static class WebApiConfig { public static void Register(HttpConfiguration config) { // CORS配置必须放在所有Web API配置的最前面 var corsAttr = new EnableCorsAttribute("你的前端域名,如http://localhost:4200", "*", "*"); config.EnableCors(corsAttr); // 后续再放属性路由、API路由等其他配置 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }RouteConfig里,两个框架的请求管道相互独立,配置错位置不会对Web API请求生效。 - 前端Angular代码不需要做跨域相关的特殊修改,等服务端异常修复、所有响应都正常携带CORS头后,错误就能被正常捕获,不会再出现跨域假提示。
内容的提问来源于stack exchange,提问作者Chitta
相关产品推荐
相关产品推荐

