1

试图封装一个部分视图以显示我可以推回给客户的反馈。

本文展示了一种使用 HTML5 服务器发送事件 (SSE) 推回数据的方法。

我注意到,如果我打开几个浏览器选项卡然后关闭一个,我会遇到异常,因为逻辑没有从 ConcurrentQueue 中删除相应的流。我修改了代码如下

    private static void TimerCallback(object state)
    {
        StreamWriter data;
        Random randNum = new Random();
        //      foreach (var data in _streammessage)
        for (int x = 0; x < _streammessage.Count; x++)
        {
            _streammessage.TryDequeue(out data);
            data.WriteLine("data:" + randNum.Next(30, 100) + "\n");
            try
            {
                data.Flush();
                _streammessage.Enqueue(data);
            }
            catch (Exception ex)
            {
                // dont re-add the stream as an error ocurred presumable the client has lost connection
            }
        }
        //To set timer with random interval
        _timer.Value.Change(TimeSpan.FromMilliseconds(randNum.Next(1, 3) * 500), TimeSpan.FromMilliseconds(-1));

    }

我还必须修改 OnStreamAvailable 成员,因为框架语法已更改为第二个参数是 HttpContent 而不是 HttpContentHeaders

 public static void OnStreamAvailable(Stream stream, HttpContent headers, TransportContext context)

现在的问题是,如果我添加或删除客户端,我仍然会出现不一致的行为,即尝试初始化新客户端时它会超时。有没有人有任何想法或更多使用 SSE 与 WinAPI 和正确的“方法框架”来处理断开连接的客户端的例子

干杯蒂姆

4

1 回答 1

1

这篇文章其实是我从 5 月份的原创文章的改编——http: //www.strathweb.com/2012/05/native-html5-push-notifications-with-asp-net-web-api-and-knockout-js /(注意变量名和端口号是相同的:-)。

这是您提出的一个非常有效的观点,并且使用此设置检测断开的连接并不是一件容易的事。主要原因是,虽然 ASP.NET(主机)允许您检查断开的连接,但 ASP.NET(主机)和 Web API 之间没有通知机制来通知这一点。

这就是为什么为了检测断开的连接(断开的客户端),您应该真正尝试写入流,并捕获任何错误 - 这意味着客户端已断开连接。

我在 aspconf 向 Brad Wilson/Marcin Dobosz/Damien Edwards 提出了同样的问题,Damien 建议使用HttpContext.Current.Response.IsClientConnected- 所以基本上绕过 Web API 并直接从底层主机获取连接信息(但是无论如何仍然涉及竞争条件)。这确实是 .NET 4。他还指出了一种有趣的方法,可以在 .NET 4.5 中使用异步取消令牌来避免这个问题。坦率地说,我从来没有时间测试它,但也许这是你应该探索的东西。

您可以在此视频中看到他们对这个问题的回应 - http://channel9.msdn.com/Events/aspConf/aspConf/Ask-The-Experts - 快进到 48:00

于 2012-10-20T20:26:51.803 回答