代码之家  ›  专栏  ›  技术社区  ›  joedotnot

在我添加了一个DelegatingHandler之后,WebAPI 2出现了间歇性CORS问题

  •  0
  • joedotnot  · 技术社区  · 5 年前

    我根据以下片段创建了一个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政策阻止:否 “访问控制允许来源”标题出现在请求的 资源

    注意:我正在Visual Studio下运行服务器/WebAPI。 我也不明白间歇部分;如果我在线路上设置断点

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

    ,调用继续进行到完成,并且没有CORS错误(似乎稍微停顿一下有帮助);如果删除断点,则阻塞消息是间歇性的。

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

    0 回复  |  直到 5 年前
        1
  •  -1
  •   joedotnot    5 年前

    我已经找出了问题所在,间歇性的错误是由于我在 CustomInterceptor : DelegatingHandler .

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

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

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

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

    推荐文章