【发布时间】: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。以下是失败的代码(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 接口,但不幸的是它仍然为空。显然这是由于我的代码存在错误,所以这不是问题。
【问题讨论】:
标签: servicestack