2

场景如下:

  1. 用户单击以下载需要很长时间才能完成的复杂报告(比会话超时时间长)。
  2. 报告完成后,用户单击任何其他链接,但会话已过期。

用户想知道为什么会话在长时间运行的请求期间过期。

如何告诉 ASP.NET 在请求期间不要使会话过期?(在请求完成后开始计算会话超时。)

更新:该解决方案应该在没有 JavaScript 的情况下工作。

4

3 回答 3

5

Web 应用程序及时响应请求。我认为实际的问题不是会话超时,而是应该将其卸载到后端时,一个长时间运行的进程正在内联发生。

与其让用户等待报告,不如在服务器上启动一个进程来生成报告并用一个响应来响应用户,表明他们的请求已排队并正在处理中,并且他们的报告将在过程完成。

然后,用户可以继续浏览网站、使用应用程序等。报告完成后,您可以通过多种方式通知用户。应用程序可以向他们发送电子邮件,甚至可能附上报告。或者可能有一些应用程序内通知系统(如 Facebook 通知程序),它们要么具有 AJAX 轮询机制,要么(响应您关于不使用 JavaScript 的更新)可能更被动,只需在他们的首页请求中通知他们以下报告的完成。

无论如何,任何需要这么长时间的过程都不应该在 Web 应用程序中嵌入。

编辑:作为建议的设置,您可以执行以下操作:

  1. 当用户请求报告时,将记录添加到队列表中,其中包括开始生成报告所需的任何信息。
  2. 将应用程序控制权返回给用户。
  3. 编写轮询队列表并处理该表中的任何报告的 Windows 服务或计划的控制台应用程序。
  4. 在每个报告完成后,更新其在表格中的状态。
  5. 还可以选择让服务/应用程序通知用户(电子邮件、将记录添加到驱动网站上应用程序内通知系统的表中,等等)。
  6. 用户可以按照通知下载报告,或者只是在网站上查看他们的“报告队列”。
于 2012-09-19T13:35:36.057 回答
0

什么需要很长时间,报告的生成或文件的下载?如果操作需要很长时间,您可能会遇到页面超时,您的方法响应时间过长。

如果会话过期是因为用户请求的文件需要很长时间才能下载,那么这是正常行为。用户请求文件并且在下一个请求之前他看起来是非活动的,会话不会刷新并且它会过期。

于 2012-09-19T13:37:38.297 回答
0

您可以通过在报告生成期间(可能多次)设置HttpSessionState.Timeout值来手动延长特定会话的会话超时。

这似乎有点笨拙,但是,假设您始终能够提前知道将其增加多长时间,并且您需要确保事后将其重新设置,否则您最终会遇到“已经生成了一份报告,与那些没有的人有不同的超时时间

虽然这可能有效,但它肯定不是最好的方法,您确实应该将此作为异步任务运行。

于 2012-09-19T13:44:23.827 回答