【问题标题】:How to read IHttpRequest to gain access to session in validation, on self-hosted ServiceStack?如何在自托管的 ServiceStack 上阅读 IHttpRequest 以访问验证会话?
【发布时间】:2014-07-31 23:31:03
【问题描述】:

这方面有好几篇文章。顺便说一句,我在 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。以下是失败的代码(GetSessionIdGetSessionKey 调用)。

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 接口,但不幸的是它仍然为空。显然这是由于我的代码存在错误,所以这不是问题。

【问题讨论】:

    标签: servicestack


    【解决方案1】:

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

    public MyDtoValidator : AbstractValidator<MyDto>, IRequiresHttpRequest
    

    验证过滤器将在启动验证器时代表您注入请求。然后,您可以通过属性HttpRequest 获取请求。我已经在一个更简单的解决方案上对此进行了测试,并且成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      相关资源
      最近更新 更多