我的prod服务器上的MVC3应用程序有问题(我在VS12中没有任何问题)。
应用程序在_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>
Controller看起来像这样:
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。
产品服务器:
修改
似乎问题已解决,是的!感谢@vtortola提供的Session提示。我做了一些研究,发现了很好的链接。然后我创建了一个新的Controller,它上面有[SessionState(SessionStateBehavior.ReadOnly)]。就是这样,一个属性解决了我的问题:)!
这是一个有用的链接,特别是当你想要一个像ReadAndWrite这样的SessionStateBehavior时 http://www.davidcoombes.co/?p=151
答案 0 :(得分:0)
您当时更新了多少个列表?会话对象使用了一种pesimisctic并发方法,这意味着当时只能为同一个会话处理一个请求。如果您并行执行多个请求,请尝试禁用该控制器中的会话,或使会话只读。看一下SessionStateAttribute。
干杯。