2012-12-09 67 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