WebAPI和HTML5

WebAPI和HTML5,html,asp.net-mvc-4,asp.net-web-api,server-sent-events,Html,Asp.net Mvc 4,Asp.net Web Api,Server Sent Events,试图封装一个局部视图以显示反馈,我可以将反馈推回到客户机 这显示了使用HTML5服务器发送事件(SSE)推回数据的方法 我注意到,如果我打开几个浏览器选项卡,然后关闭其中一个,就会出现异常,因为逻辑没有从ConcurrentQueue中删除相应的流。我对守则作了如下修改 private static void TimerCallback(object state) { StreamWriter data; Random randNum = new

试图封装一个局部视图以显示反馈,我可以将反馈推回到客户机

这显示了使用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));

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

干杯
Tim

这篇文章实际上是对我5月份的原始文章的改编——(注意,即使变量名和端口号也是一样的:-)

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

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

我在aspconf向Brad Wilson/Marcin Dobosz/Damien Edwards问了同样的问题,Damien建议使用
HttpContext.Current.Response.IsClientConnected
——因此基本上绕过Web API,直接从底层主机获取连接信息(不过仍然存在竞争条件)。那真的是.NET4。他还指出了一种有趣的方法,在.NET4.5中使用异步取消令牌可以避免这个问题。坦白地说,我从来没有抽出时间来测试它,但也许这是你应该探索的东西


你可以在这段视频中看到他们对这个问题的反应--快进到48:00

这篇文章实际上是对我5月份的原始文章的改编—(注意,即使变量名和端口号也是一样的:-)

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

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

我在aspconf向Brad Wilson/Marcin Dobosz/Damien Edwards问了同样的问题,Damien建议使用
HttpContext.Current.Response.IsClientConnected
——因此基本上绕过Web API,直接从底层主机获取连接信息(不过仍然存在竞争条件)。那真的是.NET4。他还指出了一种有趣的方法,在.NET4.5中使用异步取消令牌可以避免这个问题。坦白地说,我从来没有抽出时间来测试它,但也许这是你应该探索的东西


你可以在这段视频中看到他们对这个问题的反应--快进到48:00

Hi Filip,感谢这听起来像是WebAPI还没有制定出一个“可靠”的机制。我不知道如何使用iClientConnected属性。在通过ConcurrentQueue项循环时,我是否可以获得单个响应的句柄?通过关闭catch中的流来稳定代码。data.BaseStream.Close();data.Close();谢谢你的更新,蒂姆。还可以更新您的原始示例。此外,如果
TryDequeue
失败,您的数据将为空?您好,Filip,谢谢您,这听起来像是WebAPI尚未制定出“可靠”机制。我不知道如何使用iClientConnected属性。在通过ConcurrentQueue项循环时,我是否可以获得单个响应的句柄?通过关闭catch中的流来稳定代码。data.BaseStream.Close();data.Close();谢谢你的更新,蒂姆。如果
TryDequeue
失败,您的数据将为空,那么也可以更新原始示例?
 public static void OnStreamAvailable(Stream stream, HttpContent headers, TransportContext context)