【问题标题】:How to access IHttpRequest from my custom serializer in ServiceStack如何从 ServiceStack 中的自定义序列化程序访问 IHttpRequest
【发布时间】:2014-03-31 16:13:53
【问题描述】:

我们的模型有自定义序列化程序,可根据请求路径保护敏感数据。 (例如,如果请求不以“/admin”开头)。

到目前为止,我们已经尝试在具有 ReuseScope.None 或 ReuseScope.Request 的 RequestFilter 上使用 Funq 容器注册 IHttpRequest,并且在序列化程序上,我们从容器中获取 IHttpRequest。

我们发现如果有多个请求未决,容器将返回最后注册的 IHttpRequest,它并不总是正确的请求对象。

我知道我们可以尝试在应用过滤器属性的模型上实现对敏感数据的保护,但这非常麻烦,因为我们的模型对象通常嵌入到其他对象或集合中。

如果不是因为无法从序列化器中获取正确的 HttpRequest 对象的问题,让序列化器来做这件事对我们来说是迄今为止最好的解决方案。

那么,正确的方法是什么?或者这是一种不好的做法?

这里有几个代码示例:

所以这是我的序列化程序用来定义它们是否在“管理员”路由中被序列化的私有方法:

    private bool IsAdminRoute() {
        var path = container.Resolve<IHttpRequest> ().PathInfo;
        var res = path.StartsWith ("/admin");
        return res;
    }

这是它的用法:

    public Question QuestionSerializer(Question question)
    {
        if (!IsAdminRoute())
        {
                      // do stuff like nullyfying certain properties
        }
        return question;
    }

在我的 AppHost 初始化中,我有:

    void ConfigureSerializers(Funq.Container container)
    {
        Serializers = new CustomSerializers ();
                    // ...
        JsConfig<Question>.OnSerializingFn = Serializers.QuestionSerializer;
                    // ...
    }


    public void HttpRequestFilter(IHttpRequest httpReq, IHttpResponse httpRes, object dto) {
        Container.Register <IHttpRequest>(c => httpReq).ReusedWithin (Funq.ReuseScope.Request);
    }

注意:我使用的是 ServiceStack v3。

【问题讨论】:

  • 我认为如果您可以发布代码的基本示例,您的情况会更容易理解。据我了解,您有进入 ServiceStack 的请求,您使用的是自定义序列化程序而不是 ServiceStack.Text,您需要访问序列化程序请求过滤器中的请求对象,您目前正尝试通过 Funq 容器执行此操作?对吗?
  • 您使用的是 v3 还是 v4?
  • @Scott 我试图用最后一次编辑回答你的两个问题。

标签: c# servicestack servicestack-text funq servicestack-bsd


【解决方案1】:

我设法通过这种方式注册 IHttpRequest 使其工作:

        container.Register(c => HttpContext.Current.ToRequestContext ().Get<IHttpRequest>()).ReusedWithin(Funq.ReuseScope.None);

现在,当我尝试解决它们时,我总是得到我应该得到的 IHttpRequest 对象。

此外,在我的应用程序中经过更彻底的测试后,我能够检测到,如果并发性足够高,依赖于 ReuseScope.Request 注册的所有内容都会混淆。

解决方案非常简单,我现在依靠 HttpContext.Current.Items 集合来存储这些特定于请求的依赖项并将它们注册到请求过滤器上,如下所示:

        HttpContext.Current.Items ["Token"] = token;
        container.Register<Token> (c =>  (Token)HttpContext.Current.Items["Token"]).ReusedWithin(Funq.ReuseScope.None);

现在它每次都按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多