ASP.NET MVC 3 Загрузка сайта очень медленная - PullRequest
20 голосов
/ 16 декабря 2011

Я действительно не знаю, с чего начать этот вопрос, но сайт, над которым я работаю, иногда имеет очень медленную загрузку страниц. Особенно после сборки, но не всегда. Мне обычно приходится обновлять страницу 5-10 раз, прежде чем она появится. Я думаю, что я пытаюсь увидеть, где именно я должен начать искать.

ASP.NET MVC 3 Ninject AutoMapper Entity Framework Code First 4.1 SQL Server 2008 Бритва

ОБНОВЛЕНИЕ

Что касается некоторых вопросов, он может выполнять эту долгую загрузку на каждой странице, но после того, как загружается достаточно быстро на всех страницах.

После публикации этого сообщения и получения ваших ответов я запустил приложение, оно все еще загружается и, вероятно, никогда не загрузится, пока я не нажму на перезагрузку в браузере.

Нет кэширования, а модели EF невелики.

Я использую Razor и Visual Studio 2010 с 6 ГБ памяти и процессором I7.

Я использую IIS Express и веб-сервер по умолчанию при отладке. Это также делается на 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 ]

14 голосов
/ 16 декабря 2011

Я бы начал с проверки того, какие таймауты установлены в IIS для самого процесса, который будет перерабатываться.

Я также очень большой поклонник MVC Mini-Profiler , который может точно показать, сколько времени занимают различные части загрузки вашей страницы, определенно посмотрите на это.

Редактировать:

Стоит отметить, что проект Glimpse также отлично подходит для этой задачи в наши дни.

6 голосов
/ 16 декабря 2011

Похоже, что это может быть проблема с утилизацией IIS AppPool, если вы испытываете ее после сборок или после периодов бездействия.

Чтобы помочь с таймаутами AppPool, вы можете использовать командный файл Я создал, чтобы помочь смягчить проблему.

Это не решит проблему для вас после новых сборок, потому что ваше приложение ASP.NET MVC должно быть JIT-скомпилировано при первом запуске.Если вы действительно хотите устранить эту проблему, вы можете использовать ASP.NET precompliation .

1 голос
/ 16 декабря 2011

Попробуйте Проблеск или используйте ASP.NET Tracing .

Вы также можете предварительно скомпилировать ваши представления , если вы используете механизм просмотра Razor через Генератор одиночных файлов Razor для MVC .

0 голосов
/ 16 декабря 2011

забавно - я однажды заметил нечто похожее с unity и mvc, но проблема, на мой взгляд, решилась сама собой.Вы также можете попробовать профилировщик муравьев, чтобы увидеть, если проблема не в MVC.

Если вы оставите один запрос (без запроса 5+ раз), что произойдет?Позвольте запустить один запрос - это ЛЮБОЙ из вашего кода?(настройте ведение журнала log4net, nlog и т. д.), чтобы запустить application_start и т. д., чтобы узнать, вызывается ли какой-либо код после компиляции.

0 голосов
/ 16 декабря 2011

Это зависит от того, что произошло в вашем предыдущем запуске, иногда, если вы выдаваете ошибку и не устраняете ее, у вас будут проблемы с запуском приложения. Это помогает перезапускать браузер каждый раз при сборке, если произошла ошибка.

Однако это может быть проблемой кеширования. Возможно, ваша база данных кэшируется из-за плохо поддерживаемого удаления контекста. Это заставит поиски работать быстрее и быстрее, так как они встречались на страницах. Убедитесь, что вы всегда вызываете .dispose (), когда выполняете транзакции с базой данных.

...