OWIN Web API CancellationToken没有被调用

O. *_*sti 8 c# asynchronous server-sent-events asp.net-web-api cancellation-token

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

我正在尝试使用服务器发送事件。客户端发送一个打开流的请求,并且我想在关闭流时执行逻辑(即用户关闭浏览器或调用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在localhost上进行测试时,一切都按预期工作。

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

另一个奇怪的怪癖是,有时后,当卡被读取(和原因OnCardRead,以火),执行后OnCardRead,它确实达到OnDisconnect

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

似乎取消令牌确实得到了通知,但是仅当另一个线程正在执行代码时才得到通知?但是,为什么仅在从另一个主机发送请求时才发生这种情况?

有人对这种特殊行为有解释(和解决方案)吗?

O. *_*sti 6

事实证明,问题实际上在于部署的版本使用了Angular服务工作者,这在流请求(链接)上引起了问题,并且与服务器无关