web-dev-qa-db-ja.com

ASP.NET MVC3サイトの読み込みが非常に遅い

この質問をどこから始めればよいのか本当にわかりませんが、私が取り組んでいるサイトでは、ページの読み込みが非常に遅い場合があります。特にビルドを行った後ですが、常にではありません。私は通常、実際に表示される前にページを5〜10回更新する必要があります。私は正確にどこを見始めるべきかを見ようとしていると思います。

ASP.NET MVC 3 Ninject AutoMapper EntityFrameworkコードファースト4.1SQL Server 2008 Razor

[〜#〜]更新[〜#〜]

いくつかの質問に関しては、すべてのページでこの長い読み込みを実行できますが、読み込み後はすべてのページでかなり高速に読み込まれます。

これを投稿して返信を受け取った後、アプリケーションを起動しましたが、まだ読み込まれており、ブラウザで[再読み込み]をクリックしない限り読み込まれない可能性があります。

キャッシングはなく、EFモデルは巨大ではありません。

6GBのメモリとI7プロセッサを搭載したRazorとVisualStudio2010を使用しています。

デバッグ時にIIS ExpressとデフォルトのWebサーバーを使用しています。これは、メインサーバーのIIS7でも実行されます。

MVCプロファイラーとGlimpseを調べて、何が見つかるかを確認する場合があります。

以下に、ホームページにアクセスしたときに実行されるコードをいくつか示します。私が最初にサーバーを起動したとき、それは決してロードされないと思います。ヒットしないvarモデルにブレークポイントを設定しました。ページをリロードすると、リロードされます。

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

プロセス自体をリサイクルするために、IISでタイムアウトが設定されていることを確認することから始めます。

私は MVC Mini-Profiler の大ファンでもあり、ページの読み込みのさまざまな部分にかかる時間を正確に示すことができます。ぜひご覧ください。

編集:

Glimpse project も最近のこのタスクに最適であることは注目に値します。

14
sclarson

IIS AppPoolのリサイクルで問題が発生している場合は、ビルド後または非アクティブ期間の後に問題が発生している可能性があります。

AppPoolのタイムアウトを支援するために、問題を軽減するために作成した バッチファイル を利用できます。

ASP.NET MVCアプリケーションは最初の実行時にJITコンパイルする必要があるため、新しいビルド後の問題は解決されません。その問題を本当に解消したい場合は、 ASP.NET precompliation を使用できます。

6
Aaronontheweb

Glimpse を試すか、 ASP.NET Tracing を使用してください。

MVC用のRazor Single File Generator を介してRazorビューエンジンを使用している場合は、 ビューをプリコンパイルする にすることもできます。

1

おかしい-UnityとMVCで似たようなものに一度気づきましたが、私が信じている問題は自然に解決しました。 antプロファイラーを試して、問題がMVCの外部にあるかどうかを確認することもできます。

1つのリクエストを(5回以上リクエストせずに)そこに置いておくとどうなりますか?単一のリクエストを実行しましょう-コードのいずれかがヒットしましたか? (設定ログlog4net、nlogなど)application_startなどを実行して、コンパイル後にコードが呼び出されているかどうかを確認します。

0

前回の実行で何が起こったかによって異なります。エラーをスローしてそれをクリアしないと、アプリケーションの実行で問題が発生する場合があります。エラーが発生した場合は、ビルドするたびにブラウザを再起動すると便利です。

ただし、これはキャッシュの問題である可能性があります。コンテキストの破棄が適切に維持されていないために、データベースがキャッシュしている可能性があります。これにより、ページで検出されたルックアップがますます高速に実行されます。データベーストランザクションが完了したら、必ず.dispose()を呼び出すようにしてください。

0
Travis J