c# - 未调用 OWIN web api CancellationToken

标签 c# asynchronous asp.net-web-api server-sent-events 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;
    }
}

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

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

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

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

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

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

最佳答案

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

关于c# - 未调用 OWIN web api CancellationToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57923761/

相关文章:

c# - 将数组从 jQuery POST 传递到 C# WebApi

c# - 如何在 Windows 窗体应用程序中关闭多个窗体

javascript - forEach 循环中的异步 API 调用

c# - 换色器功能的堆栈溢出错误

node.js - 如何在 Node.JS 中编写异步 While 循环

c++ - std::async 将创建和异步执行的最大线程数是多少?

unit-testing - Autofixture 和 WebApi Controller

asp.net-web-api - Application_End()WebApi

C# 自定义属性未应用

c# - 如何在NEST 2.0中设置文档名称