【问题标题】:How do I keep TCP/IP socket open in IIS?如何在 IIS 中保持 TCP/IP 套接字打开?
【发布时间】:2014-05-29 16:07:52
【问题描述】:

我有以下使用场景: 用户登录到 ASP.NET 应用程序;并在某个时候与远程 TCP/IP 服务器建立连接。服务器的响应可能会在显着延迟(例如,几个小时)之后出现。假设用户提交了一个批处理作业,该作业可能运行了很长时间。因此,用户可以关闭浏览器,喝杯咖啡,稍后再回来查看结果。

但是,如果客户端关闭连接,服务器将永远返回结果。因此,将 Socket 信息保留在 Application 对象中是行不通的——一旦用户关闭浏览器,它就会消失。

在 IIS 启动时,还有其他方法可以保留这个打开的套接字吗?此外,如果第二个用户登录,我更愿意使用相同的连接。最后,我意识到解决方案很脆弱,有时可能会破裂。没关系。

远程服务器是有 20 年历史的大型机应用程序;所以那里没有改变的机会。只要用户不注销 - 现在一切正常。一切都在 LAN 上,因此不会出现使情况复杂化的路由问题。

【问题讨论】:

  • 您可以使用带有 GUID 的 cookie 为之前的会话重新建立连接。我不建议将会话保持那么长时间,如果它们由于任何其他原因被破坏。或者 sql sessionstate tracking 什么的。饼干更简单。 msdn.microsoft.com/en-ca/library/ms526029%28v=vs.90%29.aspx
  • cookie 的问题(如果我正确理解您的建议)它不能解决根本问题。一旦用户关闭浏览器,Application 对象就会被销毁并关闭连接。没有“重新建立”连接。所以,我不确定 cookie 会有什么帮助......
  • 为什么当用户注销时应用程序状态会消失?这听起来不对。你那里有一个错误。修复它,这将起作用(以一种脆弱的方式,但你说没关系)。
  • 这是真的,我只是重新阅读了 OP 并注意到了。大声笑...仍然需要某种身份验证来维护池回收、会话超时等的状态...(除非没有必要)。不过,可以在一个下午实现基于 cookie 的身份验证。
  • @usr - 我误解了 Microsoft 文档。你介意把它作为答案,所以我可以接受吗?谢谢

标签: asp.net sockets iis tcpclient


【解决方案1】:

当用户退出时,应用程序字典的内容不会丢失。你的计划会奏效(以一种脆弱的方式,但你说没关系)。

请注意,工作进程可能出于多种原因退出,因此预计会在任意时间点被终止。

【讨论】:

  • 我不会认为应用程序状态也可以在没有 cookie 的情况下自动重新建立会话? ;p
【解决方案2】:

你有几个选项来保持会话状态:MSDN - Session-State Modes

  • inproc 模式:断开连接,状态丢失。如果您使用 cookie,以及 将信息/数据存储在后端某处,然后您可以映射 GUID 到数据,无论会话如何。或使用应用程序状态。
  • stateserver:在断开连接和应用程序重新启动时保持不变, 但不会跨 iis/pool/server 重新启动,除非您使用另一个 服务器,或 cookie/auth。有时可能会出现问题。
  • sqlserver:顾名思义,使用特殊格式的 db/table 结构在各种场景中持久化状态数据。
  • custom/off:允许您构建自己的提供程序,或完全关闭它。

这是 cookie 方法,目前为止最简单(您必须生成一个 GUID,然后将其存储在 cookie 和应用程序状态或后端数据库中):MSDN - Maintaining Session State with Cookies

您可以在用户的​​客户端上保留 cookie。然后,在服务器上 重新启动/客户端断开连接/任何其他情况只需从中提取 GUID 应用程序/会话状态或来自后端数据库,该数据库也将存储数据 用于报告/输出。

另外,请注意:即使 cookie 可用于通过 GUID 对用户进行帐户/数据库记录的身份验证,但对于所有其他目的,除了无法识别的信息(例如:查看购物车、简单报告、状态等...

哦,还有关于 IIS 会话超时的内容(默认为 20 分钟):MSDN - Configure Session Time-out (IIS 7)MSDN - Configure Idle Time-out Settings for an Application Pool (IIS 7)

完全忘记添加链接:ASP.NET Application State OverviewASP.NET Session State Overview,但不建议在应用程序状态的繁忙服务器上存储大量数据。哦,是的,还有MSDN - Caching Application Data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多