OWIN web api 未调用 CancellationToken

OWIN web api CancellationToken not being called

我将 C# Web-Api 与 Owin 一起使用,作为 Windows 服务托管,以公开卡 reader 实用程序。

我正在尝试使用服务器发送的事件。客户端发送打开流的请求,我想在它关闭时做逻辑(即用户关闭浏览器,或调用eventSource.close()

看起来是这样的:

public class CardReaderController: ApiController
{
    static ConcurrentDictionary<int, Connection> connections = new ConcurrentDictionary<int, Connection>();
    static CardReader cardReader = CardReader.Instance;

    CardReaderController() 
    {
        cardReader.OnCardRead += OnCardRead;
    }

    static void OnDisconnect(int id)
    {
        connections.TryRemove(id, out var connection);
        connection.Writer.Close();
    }

    static void OnCardRead(string cardData)
    {
        foreach(var connection in connections.Values)
            connection.Writer.WriteLine("data: " + cardData + "\n")
    }

    [HttpGet]
    public HttpResponseMessage Events(CancellationToken onDisconnect) 
    {
        ...
        int id = Request.GetHashCode();
        var response = Request.CreateResponse();
        onDisconnect.Register(() => OnDisconnect(id));

        Response.Content = new PushStreamContent((stream, content, context) => 
        {
            var connection = new Connection(new StreamWriter(stream){ AutoFlush = true });

            connection.Writer.WriteLine("data: connection started\n");
            connections.TryAdd(id, connection);
        }, "text/event-stream");

        return response;
    }
}

在本地主机上测试时,一切都按预期工作。

但是,当部署到另一个域并从那里发出请求时,不会调用取消令牌,并且 OnDisconnect 未达到。

另一个奇怪的怪癖是,有时稍后,当读取卡片时(并导致 OnCardRead 触发),在执行 OnCardRead 之后,它 达到 OnDisconnect.

终止服务时也会发生这种情况。

似乎取消标记确实收到通知,但只有在另一个线程正在执行代码时才收到通知?但为什么只有在从另一台主机发送请求时才会发生这种情况?

有人对这种奇怪的行为有解释(和解决方案)吗?

原来问题实际上在于部署的版本使用了一个Angular service worker,这导致流式请求(link)出现问题,与服务器无关