ServiceStack / Funq在请求完成后不处理RavenDB文档会话

时间:2014-02-03 19:36:46

标签: servicestack ravendb

在尝试将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“就集成点而言”,但我仍然得到这个最大会话请求异常而且我不明白如何。我也无法可靠地复制异常或抛出它的条件,这是非常令人不安的。

0 个答案:

没有答案