ASP.NET MVC 3站点加载速度极慢

时间:2011-12-15 20:21:08

标签: performance asp.net-mvc-3 entity-framework-4.1 ninject

我真的不知道从哪里开始这个问题,但我正在处理的网站有时会有一些非常慢的页面加载。特别是在完成构建之后,但并非总是如此。我通常必须在实际出现之前刷新页面5-10次。我想我正试图看看我应该从哪里开始看。

ASP.NET MVC 3 Ninject AutoMapper 实体框架代码第一4.1 SQL Server 2008 剃刀

更新

关于一些问题,它可以在每个页面上进行长时间加载,但是在所有页面上加载它相当快。

发布此内容并获得回复后,我启动了应用程序并且仍在加载,除非我在浏览器上单击重新加载,否则可能无法加载。

没有缓存,EF模型也不大。

我正在使用带有6 GB内存和I7处理器的Razor和Visual Studio 2010。

我在调试时使用IIS Express和默认Web服务器。它也在主服务器上的IIS7上执行此操作。

我可以查看MVC Profiler和Glimpse以了解我能找到的内容。

下面我有一些代码,当它到达主页时运行。我会说它在我第一次启动服务器时从不加载。我在var模型上设置了一个永不受到打击的断点。如果我重新加载页面,那就确实如此。

public ActionResult Index()
        {
            var model = new HomeViewModel();

            model.RecentHeadlines = _headlineService.GetHeadlines(1, Config.RecentHeadlinesPageSize, string.Empty);

            return View(model);
        }

下面是我的datacontext设置。

public class DatabaseFactory : Disposable, IDatabaseFactory
    {
        private DataContext _dataContext;
        public DataContext Get()
        {
            return _dataContext ?? (_dataContext = new DataContext());
        }
        protected override void DisposeCore()
        {
            if (_dataContext != null)
                _dataContext.Dispose();
        }
    }

public class Disposable : IDisposable
    {
        private bool isDisposed;

        ~Disposable()
        {
            Dispose(false);
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        private void Dispose(bool disposing)
        {
            if (!isDisposed && disposing)
            {
                DisposeCore();
            }

            isDisposed = true;
        }

        protected virtual void DisposeCore()
        {
        }
    }

public class UnitOfWork : IUnitOfWork
    {
        private readonly IDatabaseFactory _databaseFactory;
        private DataContext _dataContext;

        public UnitOfWork(IDatabaseFactory databaseFactory)
        {
            _databaseFactory = databaseFactory;
        }

        protected DataContext DataContext
        {
            get { return _dataContext ?? (_dataContext = _databaseFactory.Get()); }
        }

        public void Commit()
        {
            DataContext.Commit();
        }
    }

5 个答案:

答案 0 :(得分:14)

我首先检查IIS中设置的超时时间,以便进程自行回收。

我也是MVC Mini-Profiler的忠实粉丝,可以准确地向您显示网页各个部分的加载时间,请务必查看。

编辑:

值得注意的是,Glimpse project这些天也很适合这项任务。

答案 1 :(得分:6)

如果您在构建之后或在不活动时段之后遇到IIS AppPool回收可能会出现问题。

要帮助处理AppPool超时,您可以使用我创建的batch file来帮助缓解此问题。

在新版本之后,这不会解决您的问题,因为您的ASP.NET MVC应用程序需要在首次运行时进行JIT编译。如果您真的渴望消除该问题,可以使用ASP.NET precompliation

答案 2 :(得分:1)

尝试Glimpse或使用ASP.NET Tracing

如果您通过precompile your views使用Razor视图引擎,也可以Razor Single File Generator for MVC

答案 3 :(得分:0)

这取决于您之前运行中发生的情况,有时如果您抛出错误而未清除错误,那么运行应用程序时会遇到问题。如果出现错误,每次构建时都有助于重新启动浏览器。

但是,这可能是缓存问题。由于上下文处理维护不当,您的数据库可能正在缓存。这将导致查找在页面中遇到越来越快的速度。确保在完成数据库事务后始终调用.dispose()。

答案 4 :(得分:0)

有趣的是 - 我已经注意到类似于团结和mvc的类似东西,但我认为这个问题已经解决了。您也可以尝试使用蚂蚁分析器来查看问题是否在MVC之外。

如果你让一个请求坐在那里(没有请求5次以上)会发生什么? 让一个请求运行 - 您的代码是否被命中? (设置日志log4net,nlog等)运行application_start等,以查看编译后是否有任何代码被调用。