1

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

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

所以我只需要某种方式RequestFilterRequestFilterAttribute了解Service它的作用(或声明),然后想在其中查找一个方法,Service该方法将提供启用/禁用过滤器代码所需的逻辑。我不知道 IoC 容器的某些功能是否提供了此功能,或者是否有其他方法可以做到这一点。

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

4

1 回答 1

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并让服务正常执行。

于 2013-03-10T06:34:35.820 回答