我们的模型有自定义序列化程序,可以根据请求路径保护敏感数据。(例如,如果请求不以“/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。