servicestack 请求完成后ServiceStack/Funq未处理RavenDB文档会话,servicestack,ravendb,servicestack,Ravendb" /> servicestack 请求完成后ServiceStack/Funq未处理RavenDB文档会话,servicestack,ravendb,servicestack,Ravendb" />

servicestack 请求完成后ServiceStack/Funq未处理RavenDB文档会话

servicestack 请求完成后ServiceStack/Funq未处理RavenDB文档会话,servicestack,ravendb,servicestack,Ravendb,在尝试将RavenDB的使用与服务堆栈集成时,我遇到了针对会话管理提出的以下解决方案: 在请求完成后使用下面的行来处理DocumentSession对象的建议很有吸引力 container.Register(c => c.Resolve<IDocumentStore>().OpenSession()).ReusedWithin(ReuseScope.Request); container.Register(c=>c.Resolve().OpenSession()).Reus

在尝试将RavenDB的使用与服务堆栈集成时,我遇到了针对会话管理提出的以下解决方案:

在请求完成后使用下面的行来处理DocumentSession对象的建议很有吸引力

container.Register(c => c.Resolve<IDocumentStore>().OpenSession()).ReusedWithin(ReuseScope.Request);
container.Register(c=>c.Resolve().OpenSession()).ReusedWithin(ReuseScope.Request);
根据我对Funq逻辑的理解,我正在向IoC容器注册一个新的DocumentSession对象,该对象将为IDocumentSession解析,并且只在请求期间存在。这似乎是一个非常干净的方法

但是,此后我遇到了以下来自RavenDB的max session requests异常:

已指定此会话允许的最大请求数(30) 达到。Raven限制会话正在进行的远程调用的数量 被允许作为早期预警系统。预计会议将继续举行 寿命很短,Raven提供加载(字符串[]键)等功能 一次加载多个文档并批量保存

现在,除非我遗漏了什么,否则如果每个会话只在单个请求的持续时间内存在,我就不应该在单个会话上达到请求上限。为了解决这个问题,我尝试了以下非常不明智的解决方案,但毫无效果:

var session = container.Resolve<IDocumentStore>().OpenSession();
session.Advanced.MaxNumberOfRequestsPerSession = 50000;
container.Register(p => session).ReusedWithin(ReuseScope.Request);
var session=container.Resolve().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;
}
private readonly IDocumentSession\u session;
公共用户服务(IDocumentSession会话)
{
_会话=会话;
}
公共服务响应获取(GetUser请求)
{
var response=newservicereponse{Successful=true};
尝试
{
var user=\u session.Load(request.UserId);
if(user==null | | | user.Deleted | |!user.IsActive | |!user.IsActive)
{
抛出HttpError.NotFound(“未找到用户{0}”。.Fmt(request.UserId));
}
响应。数据=用户;
}
捕获(例外情况除外)
{
_记录器错误(例如消息,例如);
response.StackTrace=ex.StackTrace;
响应.错误.添加(例如消息);
response.Successful=false;
}
返回响应;
}

就我所见,就集成点而言,我正在“按书”实现SS+RavenDB,但我仍然得到这个max session request异常,我不知道如何实现。我也不能可靠地复制异常或抛出异常的条件,这非常令人不安

看起来你正确地使用了raven(除了“不明智”的部分)。我只能推测Funq没有处理这个会话。您可以尝试连接不同的IoC容器,如图所示。我在RavenDB和。很好的建议。我曾尝试通过ContainerBuilder实现AutoFac并连接所有依赖项,但当我不得不在AutoFac中模拟Funq的Container.RegisterValidator时,我遇到了麻烦。我认为只要创建AutoFac IoC容器适配器,我就不会免费获得RegisterValidators逻辑。您是否尝试过从命令行运行Raven.Server并从中跟踪信息?还有-RavenDB有一个分析器,可以在网站()上显示查询