2012-12-09 68 views
3

我的產品服務器上的MVC3應用程序有問題(我在VS12中沒有任何問題)。MVC3與jQuery緩慢的請求時間

  • 的jQuery 1.8.2
  • AutoFaq
  • 庫模式
  • log4net的
  • AutoMapper

的應用已在_Layout.cshtml其中有一些名單,每5更新秒通過jQuery。

代碼看起來或多或少是這樣的:

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

的UnitOfWork:

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返回的產品名稱。

即使我只有一個必須更新的列表,頁面加載速度會變慢並且它是隨機的。我也使用log4net來檢查jQuery試圖獲取產品時是否發生了什麼,但日誌是空的:)。

我也調查與MiniProfiler的問題。最慢的事情(長達15秒)是ASP.NET Begin Request。

PROD服務器:

  • 的Windows 2008
  • 3GB內存
  • 2其他.NET應用程序
  • SQL08

編輯

看來問題是固定的,YAY!感謝@vtortola提供Session的提示。我做了一些研究並找到了很好的聯繫。然後我創建了一個新的控制器,它上面有[SessionState(SessionStateBehavior.ReadOnly)]。就是這樣,一個屬性解決了我的問題:)!

這裏是一個有益的聯繫,尤其是當你想要一個像SessionStateBehavior ReadAndWrite http://www.davidcoombes.co/?p=151

+0

base.GetAllQueryable()是做什麼的?也許它會在每個請求中將所有表加載到內存中。 –

+0

@UfukHacıoğulları我已經通過jQuery添加了一些更詳細的信息 –

回答

0

多少列出你的時候更新?會話對象使用仿擬併發方法,這意味着在同一會話中只能處理一個請求。如果您並行執行多個請求,請嘗試禁用該控制器中的會話,或者使會話只讀。看看SessionStateAttribute。

乾杯。

+0

目前3列表。但是,如果我只更新1個列表,它也會發生。但是如果我需要這個會話呢?例如,沒有登錄用戶創建的產品的產品列表? –

+0

感謝@vtortola提示。如果您對我如何解決我的問題感興趣,請參閱上面編輯的帖子。 –

+0

不錯!只要記住,如果你禁用會話,你不能使用TempData,它會拋出一個異常。乾杯。 – vtortola