【问题标题】:Check connection is active in ASP.NET检查连接在 ASP.NET 中是否处于活动状态
【发布时间】:2009-04-17 17:25:14
【问题描述】:

我正在开发一个用 ASP.NET 编写的 Comet 应用程序。有一组活动连接上下文 (HttpContext)。并且有一个线程应该定期遍历集合并检查它们的状态。所以应用程序架构不是每个请求的线程。

检查连接是否处于活动状态(未被远程主机关闭)的最佳方法是什么?

我发现了这个:

context.Response.Write(' ');
context.Response.Flush();

if (!context.Response.IsClientConnected)
{
    // ...
}

但这不是一个好的解决方案,因为它需要一个线程时间来处理(Flush() 是阻塞操作)。我需要对许多并发连接运行非常快且不使用阻塞操作的解决方案。

也许有一些 IIS 或 ASP.NET 功能允许以这种方式监视连接?

【问题讨论】:

    标签: asp.net iis comet


    【解决方案1】:

    简短的回答是……不。 ASP.NET 知道为 IsClientConnected 返回 false 的唯一方法是用户是否对服务器进行了不同的调用,或者之前调用了 Response.Close。根据我的经验,用户很可能关闭连接并仍然让 IsClientConnected 返回 true。想想正在发生的底层 HTTP 通信,你就会明白为什么。

    你想完成什么?

    【讨论】:

    • 这是一个带有 Flash 客户端的聊天服务。这是确定客户端何时下线的方法。
    • 我不明白为什么从“底层 HTTP 通信”。 HTTP 是通常通过 TCP 的流。如果客户端关闭连接,则 TCP 流被破坏(这是一个在干净的 TCP 关闭时可检测到的事件,请参阅“FIN”;如果有人只是切断电线,则情况会更糟);那么 HTTP 连接本身就已知是关闭的(因为没有未来的 TCP 连接可以连接到这个 HTTP 流)。 Comet 也不例外,因为它只是一个长时间运行的 HTTP 流。
    猜你喜欢
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多