【问题标题】:ASP.Net application timeoutASP.Net 应用程序超时
【发布时间】:2010-05-15 07:42:52
【问题描述】:

我刚刚部署了一个应用程序,由于复杂的原因,它在第一次需要特定表中的任何数据时(即当客户请求查看产品第一次,所有产品数据都存储在 ProductManager 类中(其中一个实例存储在 SiteContent 类的共享属性中,使 ProductManager 可以从任何页面轻松访问)。

现在忘记了,您现在可能因为使用这种方法而怒视我。我确信它效率低下,但我现在才学习 .Net 一年左右,所以我仍在学习。

我注意到的一件事是我可以访问该站点一次,然后在 5 分钟后重新访问它,它会再次将所有数据加载到 ProductManager 类中。这似乎是一个 .Net 应用程序超时问题 - 因为会话超时设置为 30 分钟,并且当我在管理前端登录时,它会在 5 分钟后将我注销(ish)。

有人知道如何改变吗?有什么方法可以在代码中更改它而无需联系托管公司?如果不在代码中,有什么办法可以在 web.config 中更改它?

提前致谢。

问候,

理查德

更多细节:

模块 (SiteContent) 存储每个“Manager”类的实例 - 页面可以调用 Manager.Create、Manager.Update、Manager.Remove 等,并使用 Manager.Items 访问存储在管理器中的项目列表(例如 SiteContent.ProductManager.Items 返回存储在数据库中的所有产品,SiteContent.UserManager.Items 返回存储在数据库中的所有用户的列表)。看起来,因为它是一个模块,所以它在用户和页面加载之间共享。

我尝试返回一个页面并在 3 - 4 分钟后重新加载它并且加载正常,但大约 5 分钟后再次加载该页面需要几秒钟(不长 - 但我宁愿它不添加每 5 分钟加载第一页需要几秒钟)。

这对我的父亲(企业所有者)来说特别烦人,因为他输入的产品需要 5 分钟以上才能进入,或者在进入时他会休息 2 分钟,然后它要求他点击提交再次登录,同时丢失他的所有数据。我使用 web.config 的身份验证部分中指定的方法登录 - 我正在使用带有登录按钮的表单,单击它会将输入的用户名和密码与每个用户名和密码进行比较用户(通过 SiteContent.UserManager.Items)。

除此之外,我不知道你想知道什么..你能详细说明你需要知道的任何细节吗?

在进行谷歌搜索时,我发现有一个 executionTimeout 和一个 shutdownTimeout,我将尝试更改它们。

更多细节:

hmm 看来我刚刚解决了页面加载时间问题。我注意到测试数据库超过 13MB,而实时数据库只有 3MB。我对此进行了一些调查。

基本上,错误记录器每次都会记录,如果在目录页面中请求,则无法找到图像。测试站点没有更新图像,因为它不需要,所以丢失的图像表已经上升到 > 10MB.. 必须在测试中禁用图像记录。我从该表中删除了所有内容,现在所有内容都加载得很快。

至于超时的事情,我将把它留到以后 - 当我现在有更重要的事情要优先处理时,我花了太多时间在这上面 - 这个网站实际上是我最后一年的项目在 uni,我在星期五有一个关于它的演示文稿.. 一定会在这篇文章中添加更多详细信息,说明我将来如何解决这个问题,所以请不时回来查看..

感谢您花这么多时间在这上面..

问候,

理查德

【问题讨论】:

  • 听起来不像是“超时”问题,更有可能是代码没有按照您的想法执行。你能解释一下页面浏览量之间的数据是如何保留的吗?

标签: .net asp.net vb.net timeout web-config


【解决方案1】:

ASP.NET 有各种不同的超时时间,如果你使用 FormsAuthentication 那么 FormsAuthentication 有自己的超时时间,这与 Session Timeout 不同,你可以查看 System.Web 的表单身份验证配置部分,你会知道在哪里增加你的超时时间。

此外,您还必须编写 IHttpModule,因为在执行身份验证后,您可以通过在 http 模块提供的事件处理程序中初始化适当的会话值来改进您的设计。

【讨论】:

  • 我没有使用任何 asp.net 内置的身份验证机制 - 身份验证方法设置为无。 sessionState 超时设置为 60(我相信以分钟为单位)。
【解决方案2】:

你混合了 2 个超时:

  1. 会话超时 - 服务器从会话映射中清除内存的频率
  2. Auth-cookie 超时 - 客户端浏览器清理 cookie 的频率。

大约 5 分钟的信息存储在客户端的 cookie 中,要更改这一次,请查看 web.config 中的以下行:

    <authentication mode="Forms">
        <forms name=".ASPXFORMAUTH" 
              protection="All" 
              loginUrl="Login.aspx" 
              timeout="20"                 
              defaultUrl="Default.aspx"/>
    </authentication>

【讨论】:

    【解决方案3】:

    我认为这些超时都不相关。

    如果我没看错的话,第一页加载会触发数据加载。页面获取对数据的引用,将其存储在全局范围内,然后从那里使用它。

    如果这是正确的,听起来Page 数据会在几分钟后发布(这是合理的)。由于这会释放对模块的最后引用,因此模块会被垃圾回收。

    您是否尝试过在Session 对象中存储对数据的引用?这会持续更长时间。

    听起来您正在尝试进行数据缓存,也许这就是您应该在谷歌上搜索的内容。

    编辑由于您所做的(数据输入)非常简单,因此您的一个基本假设可能是错误的,所以让我们看看您的几个 cmets。

    1. 如果您的网络服务器位于某个远程位置,那么您的本地连接速度可能与读取数据库的速度无关,但如果您的意思是“几秒钟”,那很可能就是页面占用的原因加载时间。

    2. 您要保留多少数据?千字节?兆字节?千兆字节?如果是千字节,你能把它留在页面上吗?

    3. 在 Application_End() 中放任何东西都是没有意义的。只有当应用程序本身长时间未使用(比如 20 分钟)以致 IIS 告诉它结束时,才会调用它。那么你做什么都不会有什么不同。

    4. 经理不会过期,页面会过期,您可能不应该更改它。

    5. 当您尝试缓存时,您是否仍然遇到“数据库数据消失、用户注销、数据输入丢失”的问题?还是只是变得“性能缓慢”?

    【讨论】:

    • 在进一步的研究中,我同意你的观点,即这两个超时都是不相关的。我认为将它存储在会话中会更加低效,不是吗?我尝试将它存储在应用程序对象中,但这显然会占用大量资源。我想知道是否可以在 global.asax.vb 文件的 Application_End 中放置一些内容,该文件会在应用程序结束时重新初始化所有管理器类。模块有超时吗?如果是这样,可能是模块超时,导致所有管理器实例(可能)仍然存在而没有任何引用它们。
    • 刚刚查看了数据缓存。我已将其更改为将每个管理器实例存储在缓存中。我对开发站点进行了很多更改,我需要对测试站点进行这些更改 - 这可能需要几个小时,但我会用数据对其进行测试缓存在今天下午的某个时候实施,一切顺利。谢谢您的帮助。问候,理查德
    • 嗯,我刚刚想到 - 如果这只是经理到期,那么当会话超时设置为 60 分钟时,为什么在 5 分钟后将我们注销?我的意思是每个页面加载它都会遍历用户实例并将它们与会话用户名和密码进行比较,它不会将会话值引用到用户实例。理论上,如果 5 分钟后没有其他超时生效,它应该仍处于登录状态。理查德
    • 很好的缓存使它更快了一点,但实际上并没有太大区别。我开始怀疑是否是我们的互联网连接导致了问题 - 我们有宽带,但在线路的末端,所以我们只能获得拨号速度。我最初的想法是在这种情况下它不会有任何影响,因为页面加载栏在几秒钟内没有开始上升 - 这对我来说意味着浏览器还没有开始加载页面。我不知道..我完全不知道如何解决这个问题..它让我头疼..
    【解决方案4】:

    关于您的 5 分钟观察,我发现应用程序池的空闲超时默认为 5 分钟(尽管在 IIS 7.0 中默认应为 20 分钟)。

    查看您的应用程序池的“高级设置” -> 进程模型 -> 空闲超时(分钟)。您可以通过输入值 0 来完全禁用超时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 2016-09-28
      • 2020-05-10
      相关资源
      最近更新 更多