You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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请求时:

  1. 浏览器自动发送OPTIONS预检,WebApi的CORS中间件会自动响应,告诉浏览器“允许这个跨域请求”;
  2. 然后浏览器发送实际的DELETE请求,你的接口处理删除逻辑,返回对应结果;
  3. 你在Angular的subscribe里只会收到DELETE请求的响应,不会再看到两次结果了。

最后提醒一句:别手动发OPTIONS请求做业务,那是浏览器的活儿,业务操作就用对应的HTTP方法(DELETE删、POST加、PUT改)。

内容的提问来源于stack exchange,提问作者sander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:37:25