ASP.NET MVC 3网站加载极其缓慢

20

我真的不知道从哪里开始问这个问题,但是我正在工作的网站有时加载页面非常缓慢。尤其是在构建之后,但并不总是如此。通常情况下,在页面实际显示之前,我必须刷新页面5-10次。我想知道应该从哪里开始寻找问题。

ASP.NET MVC 3 Ninject AutoMapper Entity Framework Code First 4.1 SQL Server 2008 Razor

更新

关于一些问题,它可以在每个页面上长时间加载,但在加载完成后,所有页面都变得相当迅速。

发帖后,我启动了应用程序,它仍在加载中,除非我点击浏览器上的重新加载,否则可能永远不会加载。

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

我使用Razor和Visual Studio 2010,具有6GB内存和I7处理器。

调试时,我使用IIS Express和默认Web服务器。 它也会在主服务器上的IIS7上出现此问题。

我可能会查看MVC Profiler和Glimpse,看看我能找到什么。

下面是当首页被访问时运行的一些代码。我会说当我第一次启动服务器时,它永远不会加载。我在var model处设置了断点,但它从未被命中。如果我重新加载页面,则会命中。

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

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

            return View(model);
        }

以下是我的数据上下文设置。

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();
        }
    }

1
需要更多细节。这是为了打击第一页吗?每一页?只有某些页面?是否一直发生或间歇性发生? - Lester
你的EF模型有多大?你的应用程序中是否有缓存?它是在构建后特别出现的,还是每次在构建后第一次访问应用程序时都会出现(应用程序重新启动)? - Ladislav Mrnka
这也可能是由于机器速度慢造成的。你有多少内存?有多少个CPU核心?这是一台笔记本电脑还是工作站? - danludwig
你使用的是哪个视图引擎? - SliverNinja - MSFT
5个回答

14

首先,我会检查IIS中进程自动回收的超时设置。

我也非常喜欢MVC Mini-Profiler,它可以展示页面加载过程中各部分所需的时间,建议你试试。

编辑:

值得注意的是,Glimpse项目在这方面也很出色。


我安装了MVC Mini Profiler并得到了一些线索。我正在向一个异步的控制器方法进行长轮询ajax请求,但是似乎发生了一些事情,比如在我离开页面时没有被清理或停止。在注释掉这段代码后,页面开始加载,除了初始构建,这是可以预料的。 - Mike Flynn

6
似乎如果您在构建或长时间不活动后经历此问题,则可能是IIS AppPool回收的问题。为了帮助解决AppPool超时问题,您可以使用我创建的批处理文件batch file来缓解该问题。但是这不会解决新构建后的问题,因为您的ASP.NET MVC应用程序需要在第一次运行时进行JIT编译。如果您真的急于消除该问题,则可以使用ASP.NET precompliation

哇,这真的很有帮助。我不再需要每次偶尔访问我的测试服务器时等待5秒钟进行预热了。默认的空闲超时时间是多少? - avenmore
@avenmore 这取决于你的主机;一般来说,我认为默认超时时间是20分钟,但我不确定。如果你有IIS的访问权限,明确设置超时时间是最佳实践。 - Aaronontheweb

1

2
您可能需要检查的其他项目是外部MVC依赖项,例如会话状态数据服务等,这些可能导致减速。我们曾经遇到过一个问题,即过多的SQL Server会话状态流量导致网站变得缓慢(增加了200多个用户)。这在跟踪中并没有显示出来。 - SliverNinja - MSFT

0

这取决于你上一次运行发生了什么,有时如果你抛出一个错误并且没有清除它,那么你运行应用程序时会遇到问题。如果出现错误,每次构建时重新启动浏览器会有所帮助。

然而,这可能是缓存的问题。由于上下文释放不良,你的数据库可能会被缓存。这将导致查找在页面中遇到时运行得越来越快。确保在完成数据库事务后始终调用 .dispose()。


0

有趣的是 - 我曾经注意到Unity和MVC也有类似的问题,但我相信问题已经解决了。您还可以尝试使用Ants Profiler来查看问题是否在MVC之外。

如果您让单个请求保持不变(而不是请求5次以上),会发生什么? 让单个请求运行 - 你的任何代码都被触发了吗?(设置日志记录log4net、nlog等)运行application_start等,以查看编译后是否调用了任何代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接