我正在使用作为托管的C# Web和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;
}
}在本地主机上进行测试时,一切都完全按照预期工作。
但是,当部署到另一个域并发出来自该域的请求时,取消令牌不会被调用,也不会到达OnDisconnect。
另一个奇怪的奇怪之处是,有时,当一张卡片被读取时(并导致OnCardRead触发),在执行OnCardRead之后,它确实会到达OnDisconnect。
在终止服务时也会发生这种情况。
似乎取消令牌确实会得到通知,但只有当另一个线程正在执行代码时才会通知?但是为什么只有在从另一个主机发送请求时才会发生这种情况呢?
有谁能解释(和解决)这种奇怪的行为吗?
发布于 2019-09-17 16:16:39
事实证明,问题实际上在于部署的版本使用了一个有角度的服务工作人员,这会导致流请求(链接)上的问题,并且与服务器无关。
https://stackoverflow.com/questions/57923761
复制相似问题