在尝试将RavenDB使用与服务堆栈集成时,我遇到了以下为会话管理提出的解决方案:
A: using RavenDB with ServiceStack
在请求完成后使用下面一行来处理DocumentSession对象的提议很有吸引力。
container.Register(c => c.Resolve<IDocumentStore>().OpenSession()).ReusedWithin(ReuseScope.Request);
根据我对Funq逻辑的理解,我正在使用IoC容器注册一个新的DocumentSession对象,该容器将针对IDocumentSession进行解析,并且仅在请求期间存在。这似乎是一种非常干净的方法。
但是,我从RavenDB遇到了以下最大会话请求异常:
此会话允许的最大请求数(30) 到达。 Raven限制会话的远程调用次数 允许作为预警系统。会议预计会 是短暂的,Raven提供像Load(string []键)之类的设施 一次加载多个文档并批量保存。
现在,除非我遗漏了某些内容,否则如果每个会话仅在单个请求的持续时间内存在,我就不应该在单个会话上达到请求上限。为了解决这个问题,我尝试了以下,非常不明智的解决方案无济于事:
var session = container.Resolve<IDocumentStore>().OpenSession();
session.Advanced.MaxNumberOfRequestsPerSession = 50000;
container.Register(p => session).ReusedWithin(ReuseScope.Request);
以下是我如何使用已解析的DocumentSession实例的示例:
private readonly IDocumentSession _session;
public UsersService(IDocumentSession session)
{
_session = session;
}
public ServiceResponse<UserProfile> Get(GetUser request)
{
var response = new ServiceResponse<UserProfile> {Successful = true};
try
{
var user = _session.Load<UserProfile>(request.UserId);
if (user == null || user.Deleted || !user.IsActive || !user.IsActive)
{
throw HttpError.NotFound("User {0} was not found.".Fmt(request.UserId));
}
response.Data = user;
}
catch (Exception ex)
{
_logger.Error(ex.Message, ex);
response.StackTrace = ex.StackTrace;
response.Errors.Add(ex.Message);
response.Successful = false;
}
return response;
}
据我所见,我正在实施SS + RavenDB“就集成点而言”,但我仍然得到这个最大会话请求异常而且我不明白如何。我也无法可靠地复制异常或抛出它的条件,这是非常令人不安的。