【问题标题】:MVC3 slow request time with jQuery使用 jQuery 的 MVC3 缓慢的请求时间
【发布时间】:2012-12-09 14:02:13
【问题描述】:

我的产品服务器上的 MVC3 应用程序有问题(我在 VS12 中没有任何问题)。

  • jQuery 1.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。

即使我只有一个需要更新的列表,页面加载速度也会变慢,而且是随机的。我还使用 log4net 来检查当 jQuery 尝试获取产品时是否发生了某些事情,但日志是空的:)。

我还调查了 MiniProfiler 的问题。最慢的(最多 15 秒)是 ASP.NET Begin Request。

产品服务器:

  • Windows 2008
  • 3GB 内存
  • 2 个其他 .NET 应用程序
  • SQL08

编辑

看来问题已经解决了,耶!感谢@vtortola 对会话的提示。我做了一些研究,发现了很好的链接。然后我创建了一个新的控制器,上面有 [SessionState(SessionStateBehavior.ReadOnly)]。就是这样,一个属性解决了我的问题:)!

这是一个有用的链接,尤其是当您需要像 ReadAndWrite 这样的 SessionStateBehavior http://www.davidcoombes.co/?p=151

【问题讨论】:

  • base.GetAllQueryable() 是做什么的?也许它会在每次请求时将所有表加载到内存中。
  • @UfukHacıoğulları 我添加了更多细节

标签: jquery asp.net-mvc windows performance request


【解决方案1】:

您当时更新了多少列表?会话对象使用悲观的并发方法,这意味着同一会话只能同时处理一个请求。如果您正在并行执行多个请求,请尝试禁用该控制器中的会话,或将会话设置为只读。看看 SessionStateAttribute。

干杯。

【讨论】:

  • 目前通过 jQuery 列出了 3 个列表。但如果我只更新 1 个列表,也会发生这种情况。但是如果我需要会话怎么办?例如没有登录用户创建的产品的产品列表?
  • 感谢@vtortola 的提示。如果您对我如何解决我的问题感兴趣,请参阅上面编辑过的帖子。
  • 不错!请记住,如果禁用会话,则不能使用 TempData,它会抛出异常。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2014-04-21
  • 2018-02-10
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
相关资源
最近更新 更多