3

製品サーバー上の MVC3 アプリケーションに問題があります (VS12 では問題ありません)。

  • jQuery1.8.2
  • よくある質問
  • リポジトリ パターン
  • log4net
  • オートマッパー

アプリケーションの _Layout.cshtml には、jQuery を介して 5 秒ごとに更新する必要があるいくつかのリストがあります。

コードは多かれ少なかれ次のようになります。

<script type="text/javascript">
    var products = $("#products ul");

    function updateProducts() {
        setTimeout(function() {
            $.post("/Product/List", { rows: 10 }, function(html) {
                products.before(html).remove();
                products = $("#products ul");

                // To avoid multiple posts update the list until the post is done
                updateProducts();
            });
        }, 5000);
</script>

コントローラーは次のようになります。

public PartialViewResult List(int rows)
{
    var products = productService.GetNewest(rows);
    return PartialView(products);
}

サービスは次のようになります。

public class ProductService : Service<Product>, IProductService
{
    private IRepository<Product> repository;

    public ProductService(IUnitOfWorkFactory unitOfWorkFactory)
    {
        IUnitOfWork unitOfWork = unitOfWorkFactory.Create();
        this.repository = unitOfWork.ProductRepository();
        base.Repository = this.repository;
        base.UnitOfWork = unitOfWork;
    }
}

public List<Product> GetNewest(int rows)
{
    var products = repository.GetAllQueryable(); //=> returns a IQueryable
    products.OrderBy(o => o.CreateDate).Take(rows);

    return products.ToList();
}

リポジトリ (EF 5.0 コードが最初):

public class Repository<T> : IRepository<T> where T : Base
{
    private RepositoryContext _dataContext;
    private IDbSet<T> _dbset;

    public virtual IQueryable<T> GetAllQueryable()
    {
        var all = _dbset;
        return all;
    }
}

作業単位:

public class UnitOfWork : Disposable, IUnitOfWork
{
    private RepositoryContext _dataContext;
    private Repository<Product> _productRepository;

    public IUnitOfWork GetCurrent()
    {
        _dataContext = _dataContext ?? (_dataContext = new RepositoryContext());

        return this;
    }

    public IRepository<Product> ProductRepository()
    {
        _productRepository = _productRepository ?? new Repository<Product>(_dataContext);

        return _productRepository;
    }
}

また、部分ビューには、製品名を返す foreach のみが含まれています。

更新する必要があるリストが 1 つしかない場合でも、ページの読み込みが遅くなり、ランダムになります。また、log4net を使用して、jQuery が製品を取得しようとしたときに何かが発生するかどうかを確認しますが、ログは空です:)。

MiniProfiler の問題も調査します。最も遅いもの (最大 15 秒) は、ASP.NET Begin Request です。

製品サーバー:

  • Windows 2008
  • 3GB ラム
  • 2 つの他の .NET アプリケーション
  • SQL08

編集

問題は解決したようです、YAY! セッションに関するヒントを提供してくれた @vtortola に感謝します。私はいくつかの調査を行い、良いリンクを見つけました。次に、[SessionState(SessionStateBehavior.ReadOnly)] を持つ新しいコントローラーを作成しました。それだけです、属性が私の問題を解決しました:)!

これは、特に ReadAndWrite http://www.davidcoombes.co/?p=151のような SessionStateBehavior が必要な場合に役立つリンクです。

4

1 に答える 1

0

一度にいくつのリストを更新しますか? セッション オブジェクトは悲観的同時実行アプローチを使用します。つまり、同じセッションに対して一度に 1 つの要求しか処理できません。複数のリクエストを並行して実行している場合は、そのコントローラーでセッションを無効にするか、セッションを読み取り専用にします。SessionStateAttribute を見てください。

乾杯。

于 2012-12-09T16:07:53.320 に答える