如何从ServiceStack RequestFilter中查找服务

时间:2013-03-10 00:26:22

标签: servicestack

我正在尝试根据RequestFilter中可能被调用的信息来实现有条件执行的Service。我想让RequestFilter找到Service,查看方法/接口/属性,并根据它有条件地完成它的工作。

我知道您可以在RequestFilterAttribute上声明Service,但我无法想出一个让它成为条件的好方法。我想将委托/ lambda传递给属性,但C#不允许这样做。我可以在其中插入一个Type或类型名称,允许RequestFilterAttribute找到Service类/方法,但这似乎很容易复制/粘贴错误。

所以我想要某种方式让RequestFilterRequestFilterAttribute了解它所采取行动的Service(或声明)然后想要查找方法在Service内,它将提供启用/禁用过滤器代码所需的逻辑。我无法判断IoC容器的某些功能是否提供了此功能,或者是否有其他方法可以实现此功能。

然后,根据过滤器的执行方式,可能需要返回自己的数据,阻止服务实际执行。这可能吗? (this是答案吗?)

1 个答案:

答案 0 :(得分:3)

这似乎是关键:

var serviceType = EndpointHost.Metadata.GetServiceTypeByRequest(requestDto.GetType());

这将返回将处理请求的服务的类型。它不是一个实例(但我怀疑甚至还创建了一个服务实例)所以要做条件逻辑我必须定义一个静态方法然后查找它。我使用反射来查找声明特殊属性的方法,并且需要对其进行优化以获得最佳性能。

从那里我可以有条件地确定是否运行某些逻辑。如果我愿意,我也可以绕过调用服务并返回成功响应,如下所示:

var successResponse = DtoUtils.CreateSuccessResponse(successMessage);
var responseDto = DtoUtils.CreateResponseDto(requestDto, successResponse);
var contentType = req.ResponseContentType;
res.ContentType = contentType;
res.WriteToResponse(req, responseDto);
// this is the proper way to close the request; you can use Close() but it won't write out global headers
res.EndServiceStackRequest();
return;

或者我可以创建错误响应,或者只是从RequestFilter返回并让服务正常执行。