场景如下:
- 用户单击以下载需要很长时间才能完成的复杂报告(比会话超时时间长)。
- 报告完成后,用户单击任何其他链接,但会话已过期。
用户想知道为什么会话在长时间运行的请求期间过期。
如何告诉 ASP.NET 在请求期间不要使会话过期?(在请求完成后开始计算会话超时。)
更新:该解决方案应该在没有 JavaScript 的情况下工作。
场景如下:
用户想知道为什么会话在长时间运行的请求期间过期。
如何告诉 ASP.NET 在请求期间不要使会话过期?(在请求完成后开始计算会话超时。)
更新:该解决方案应该在没有 JavaScript 的情况下工作。
Web 应用程序应及时响应请求。我认为实际的问题不是会话超时,而是应该将其卸载到后端时,一个长时间运行的进程正在内联发生。
与其让用户等待报告,不如在服务器上启动一个进程来生成报告并用一个响应来响应用户,表明他们的请求已排队并正在处理中,并且他们的报告将在过程完成。
然后,用户可以继续浏览网站、使用应用程序等。报告完成后,您可以通过多种方式通知用户。应用程序可以向他们发送电子邮件,甚至可能附上报告。或者可能有一些应用程序内通知系统(如 Facebook 通知程序),它们要么具有 AJAX 轮询机制,要么(响应您关于不使用 JavaScript 的更新)可能更被动,只需在他们的首页请求中通知他们以下报告的完成。
无论如何,任何需要这么长时间的过程都不应该在 Web 应用程序中嵌入。
编辑:作为建议的设置,您可以执行以下操作:
什么需要很长时间,报告的生成或文件的下载?如果操作需要很长时间,您可能会遇到页面超时,您的方法响应时间过长。
如果会话过期是因为用户请求的文件需要很长时间才能下载,那么这是正常行为。用户请求文件并且在下一个请求之前他看起来是非活动的,会话不会刷新并且它会过期。
您可以通过在报告生成期间(可能多次)设置HttpSessionState.Timeout值来手动延长特定会话的会话超时。
这似乎有点笨拙,但是,假设您始终能够提前知道将其增加多长时间,并且您需要确保事后将其重新设置,否则您最终会遇到“已经生成了一份报告,与那些没有的人有不同的超时时间
虽然这可能有效,但它肯定不是最好的方法,您确实应该将此作为异步任务运行。