如何在自托管ServiceStack上阅读IHttpRequest以获得验证会话的访问权限?

时间:2014-07-31 23:31:03

标签: servicestack

有几个帖子。顺便说一句,我在3.9.71。

第一个是here,由@Scott回答。通常,您无法使用类似于Service.SessionAs<>的内容来真正访问会话。只是因为验证在服务甚至执行之前就开始了。

第二个是here,由@paaschpa回答。在这里,有一种方法可以掌握会话,即使在验证阶段,因为技术上我们已经

  • CacheClient,可以注入验证器
  • 基础请求,将在SessionFeature.GetSessionKey()内部检索。该方法检查ServiceStack自己的IHttpRequest,否则它将在HttpContext.Current.Request上回退。显然,因为我们没有将任何内容传递给SessionFeature.GetSessionKey(),所以该方法适用于HttpContext.Current.Request,这实际上是ASP.NET特有的。

为自托管模式配置ServiceStack后,由于我们没有HttpContext.Current.Request,因此失败。以下是失败的代码(GetSessionId调用GetSessionKey)。

public static string GetSessionId(IHttpRequest httpReq = null)
{
    if (httpReq == null && HttpContext.Current == null)
    {
        throw new NotImplementedException("Only ASP.NET Requests accessible via Singletons are supported");
    }
    httpReq = (httpReq ?? HttpContext.Current.Request.ToRequest(null));
    return httpReq.GetSessionId();
}

到目前为止似乎是如此接近的情况。我们可以在验证器中获取IHttpRequest吗?

更新

查看ServiceStackV3中的ValidationFilters.RequestFilter操作,似乎意图已经存在。请注意如果验证器实现IRequiresHttpRequest,它会将请求注入验证器。

public static class ValidationFilters
{
    public static void RequestFilter(IHttpRequest req, IHttpResponse res, object requestDto)
    {
        var validator = ValidatorCache.GetValidator(req, requestDto.GetType());
        if (validator == null) return;

        var validatorWithHttpRequest = validator as IRequiresHttpRequest;
        if (validatorWithHttpRequest != null)
            validatorWithHttpRequest.HttpRequest = req;

        var ruleSet = req.HttpMethod;
        var validationResult = validator.Validate(
            new ValidationContext(requestDto, null, new MultiRuleSetValidatorSelector(ruleSet)));

我尝试在验证器上实现IRequiresHttpRequest接口,但不幸的是它仍然是null。显然这是由于我的代码存在错误,所以这不是问题。

1 个答案:

答案 0 :(得分:1)

根据上面的更新,诀窍是确保您的验证器实现IRequiresHttpRequest,您就可以了!

public MyDtoValidator : AbstractValidator<MyDto>, IRequiresHttpRequest

验证过滤器将在您启动验证器时代表您注入请求。然后,您可以通过属性HttpRequest获取请求。我在一个更简单的解决方案上进行了测试,但它确实有效。