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)出现问题,与服务器无关
我将 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)出现问题,与服务器无关