有几个帖子。顺便说一句,我在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。显然这是由于我的代码存在错误,所以这不是问题。
答案 0 :(得分:1)
根据上面的更新,诀窍是确保您的验证器实现IRequiresHttpRequest
,您就可以了!
public MyDtoValidator : AbstractValidator<MyDto>, IRequiresHttpRequest
验证过滤器将在您启动验证器时代表您注入请求。然后,您可以通过属性HttpRequest
获取请求。我在一个更简单的解决方案上进行了测试,但它确实有效。