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。
终止服务时也会发生这种情况。
似乎取消令牌确实得到了通知,但是仅当另一个线程正在执行代码时才得到通知?但是,为什么仅在从另一个主机发送请求时才发生这种情况?
有人对这种特殊行为有解释(和解决方案)吗?
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |