添加 DelegatingHandler 后,WebAPI 2 出现间歇性 CORS 问题

Posted

技术标签:

【中文标题】添加 DelegatingHandler 后,WebAPI 2 出现间歇性 CORS 问题【英文标题】:Intermittent CORS Issue with WebAPI 2 after I added a DelegatingHandler 【发布时间】:2021-04-21 04:03:20 【问题描述】:

我根据以下片段创建了一个 WebAPI 2(完整框架 v4.7.x):

[EnableCors(origins: "*", headers: "*", methods: "*")]
public class MyTestController : ApiController

        public async Task<IHttpActionResult> GETSearchLatest20()
        
            //etc...
        

,其中 CORS 通过使用EnableCors 属性标记每个方法来启用,如上所示

这一直有效,没有任何问题。最近我在管道中引入了另一个处理程序,示例片段如下:

public class CustomInterceptor : DelegatingHandler

    protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    
        //...etc... logic here...
        
        //call the inner handlers...
        var response = await base.SendAsync(request, cancellationToken);

        //logs... etc 
        return response;
    

此后,我现在在浏览器控制台上间歇性收到可怕的 CORS 策略消息阻止。

访问 XMLHttpRequest 在 来自原点的“http://localhost:8080/api/GETSearchLatest20/” 'http://localhost:3000' 已被 CORS 策略阻止:否 请求中存在“Access-Control-Allow-Origin”标头 资源。

注意我在 Visual Studio 下运行服务器/WebAPI。 我也不明白间歇性的部分;如果我在行上放一个断点

var response = await base.SendAsync(request, cancellationToken);

,调用继续完成并且没有 CORS 错误(看起来好像有点暂停有帮助);如果我删除断点,则阻塞消息是间歇性的。

有没有人有任何想法/解决方案来解决我的 CORS 问题?

【问题讨论】:

【参考方案1】:

我已经找出问题所在,间歇性错误是由于我放置在 CustomInterceptor : DelegatingHandler 中的逻辑造成的。

添加 DelegatingHandler 会导致飞行前请求,因此 SendAsync 方法会非常快速地连续执行两次(这是我没想到的,因此出现了错误)。在第一次调用(飞行前)时,我的逻辑允许调用基本方法

var response = await base.SendAsync(request, cancellationToken);

,但是在第二次调用(实际 GET)时,我的逻辑是返回到客户端(“嘿,短时间内调用太多”),而没有继续执行上述基本方法或内部处理程序!

所以浏览器将此绕过报告为...has been blocked by CORS policy: No 'Access-Control-Allow-Origin'...etc

【讨论】:

以上是关于添加 DelegatingHandler 后,WebAPI 2 出现间歇性 CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET Core Web API 中注册一个新的 DelegatingHandler

如果 ExceptionHandler 捕获到异常,则不会调用 DelegatingHandler

HttpClient DelegatingHandler 意外生命周期

在 ASP.NET Core 5.0 Web API 中实现 DelegatingHandler?

将 DelegatingHandler 与 HttpClient 上的自定义数据一起使用

预检 CORS 请求未调用 WebApi DelegatingHandler