2011-06-06 50 views
0

我正在使用EntityFramework访问大型数据库的IIS 7.5上运行MVC 3应用程序。我公司访问数据库所需的框架初始化连接并设置一些线程上下文和安全检查 - 这个过程大约需要30秒。这应该只在应用程序启动时运行一次,但每次页面加载时都会执行此操作。MVC3 App Restarting Every Pageload

我现在设置的方法是在global.asax中有一个静态方法来检查HttpContext.Current.Application字典以查看Context类的键是否已设置,如果是,则返回Context,否则初始化上下文然后返回它。每个页面载入,字典都是空的,所以上下文必须重新初始化(如在Visual Studio 2010中检查)。

在我调用global.asax的Application_Start方法中的初始化方法之前,它也触发了每个页面负载。

即使Visual Studio没有运行,页面仍然需要永久加载。

什么可能导致应用程序重置每个页面加载?

+0

该应用可能会重新启动有几个原因(web.config中的变化,bin目录的变化,产生的线程未处理的异常等)。我会检查这个问题的答案,看看是否有任何东西在你身上跳出来:http://stackoverflow.com/questions/302110/what-c​​auses-an-application-pool-in-iis-to-recycle – rsbarro 2011-06-06 22:23:35

回答

1

你可以得到重启的理由在Application_End使用此代码:

HttpRuntime runtime = (HttpRuntime)typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null); 

    string shutDownMessage = ""; 

    if (runtime != null) 
    { 
    shutDownMessage = Environment.NewLine + "Shutdown: " + 
         (string)runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null) + 
         Environment.NewLine + "Stack: " + Environment.NewLine + 
         (string)runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null); 
    } 
+0

感谢您的码!好吧,这绝对是导致它的bin dir的变化。是否有任何记录事件会告诉你改变了什么? – Greggo 2011-06-07 14:27:45

+0

据我所知,你可以尝试使用Sysinternals进程监视器或FileMon,将筛选器设置为bin目录并监视文件系统中的更改,然后您将看到哪些文件发生了更改。 http://technet.microsoft.com/en-us/sysinternals/bb896645 – 2011-06-07 14:33:50

+0

更新:发现Visual Studio默认将日志文件放在bin目录中,每次数据库被击中时都会更新这个日志文件。我一直在尝试为日志文件设置其他文件夹的权限,但没有成功。你知道任何有关权限的教程吗?我的应用程序在DefaultAppPool – Greggo 2011-06-07 14:59:44