Angular发送Options/Delete请求出现两次请求问题求助
请求返回两次结果?大概率是CORS预检在搞鬼!
兄弟,我一眼就看出你这问题的核心了——**浏览器的CORS预检请求(Preflight Request)**在作祟,加上你代码里的一些小错位,才导致看起来“一次成功一次失败”。我给你拆解清楚:
为什么会出现两次请求?
当浏览器要发送非简单请求(比如DELETE方法,或者带自定义请求头的请求)时,会自动先弹一个OPTIONS请求到后端,目的是确认后端是否允许当前域名的跨域操作。这个请求是浏览器自动触发的,你没写代码但它会偷偷跑。
你现在的情况:
- 如果你手动用
this._http.options()发请求,再加上浏览器自动的预检(比如试DELETE时),就会出现两次请求记录; - 如果你用
DELETE请求,浏览器先自动发OPTIONS预检,再发实际的DELETE请求,所以你会看到两次响应,其中一次是OPTIONS的,一次是DELETE的,看起来像“一成功一失败”。
你的代码里的两个关键问题
1. WebApi端的特性配置错位
你给Delete方法加了[HttpOptions],这等于告诉WebApi:这个接口是用来处理OPTIONS请求的,但你的方法逻辑却是删除资源,完全搞反了!
2. Angular端用错了请求方法
删除资源应该用DELETE请求,OPTIONS是浏览器用来做预检的,不是用来执行业务操作的,你手动发OPTIONS完全没必要。
正确的调整方案
Angular端(改用DELETE请求)
// 简化路径,和后端路由对应上 const deleteUrl = 'http://localhost:49579/api/resource/28'; this._http.delete(deleteUrl, { headers }).subscribe( (value) => console.log("删除成功:", value), (error) => console.log("删除失败:", error) );
WebApi端(正确配置CORS+修正接口)
首先得让WebApi正确处理CORS预检,别自己写OPTIONS接口,用官方的CORS中间件就行:
第一步:安装并启用CORS
先在NuGet安装Microsoft.AspNet.WebApi.Cors,然后在WebApiConfig.cs里配置:
using System.Web.Http; using System.Web.Http.Cors; public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 把这里的域名换成你Angular项目的实际域名(比如http://localhost:4200) var corsSettings = new EnableCorsAttribute("http://localhost:4200", "*", "*"); config.EnableCors(corsSettings); // 其他路由配置保持不变 config.MapHttpAttributeRoutes(); } }
第二步:修正删除接口的特性
把[HttpOptions]删掉,换成[HttpDelete],路由也简化成REST风格:
[HttpDelete] [Route("api/resource/{id}")] public IHttpActionResult Delete([FromUri] int id) { if (MovieRepository.Remove(id)) { return Ok("Movie was removed"); } else { return BadRequest("Movie was not removed"); } }
调整后的逻辑
现在你发DELETE请求时:
- 浏览器自动发送OPTIONS预检,WebApi的CORS中间件会自动响应,告诉浏览器“允许这个跨域请求”;
- 然后浏览器发送实际的DELETE请求,你的接口处理删除逻辑,返回对应结果;
- 你在Angular的subscribe里只会收到DELETE请求的响应,不会再看到两次结果了。
最后提醒一句:别手动发OPTIONS请求做业务,那是浏览器的活儿,业务操作就用对应的HTTP方法(DELETE删、POST加、PUT改)。
内容的提问来源于stack exchange,提问作者sander
相关产品推荐
相关产品推荐

