【问题标题】:How to find Service from ServiceStack RequestFilter如何从 ServiceStack RequestFilter 中查找服务
【发布时间】:2013-03-12 00:39:38
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    这似乎是关键:

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

    【讨论】:

      猜你喜欢
      • 2015-04-03
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2020-02-06
      • 1970-01-01
      相关资源
      最近更新 更多