全局请求/响应拦截器

时间:2013-07-08 12:08:18

标签: servicestack

在ServiceStack中设置将为特定服务执行的请求/响应拦截器的最简单方法是什么?

请求过滤器(IHasRequestFilter)工作正常,但如果服务返回非2xx状态代码,则不会触发响应过滤器(IHasResponseFilter)。我需要检索方法返回的状态代码以及响应DTO(如果有的话)。

自定义ServiceRunner并覆盖OnBeforeExecuteOnAfterExecute方法似乎工作正常,但我发现它非常具有侵入性,因为需要为整个应用程序替换服务运行器而我找不到方式干净的方法来隔离每个功能需要在这些方法中执行的任务。

ServiceStack中是否有一些我遗漏的扩展点允许我在每个服务方法之前和每个服务方法之后执行一些代码?插件是理想的但我如何订阅一些虚构的BeforeExecuteAfterExecute方法,这些方法可以让我运行一些自定义代码?


更新:

在发布问题之后,我发现无论服务返回什么状态代码,都会执行全局响应过滤器,这正是我所需要的。最后一个问题:是否可以检索将在请求过滤器中处理请求的服务类型?我需要检查此服务是否由某个自定义标记属性修饰。

3 个答案:

答案 0 :(得分:3)

我找到了一个关于如何在自定义请求/响应过滤器中检索服务类型的问题的解决方案:

appHost.RequestFilters.Add((req, res, requestDto) =>
{
    var metadata = EndpointHost.Metadata;
    Type serviceType = metadata.GetServiceTypeByRequest(requestDto.GetType());

    ...
}

答案 1 :(得分:3)

  

自定义ServiceRunner并覆盖OnBeforeExecute和OnAfterExecute方法似乎工作正常,但我发现它非常具有侵入性,因为需要为整个应用程序替换服务运行器

快速注意,您可以选择加入并仅选择应使用自定义服务运行程序的请求,例如:

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(
  ActionContext actionContext)
{           
    return useCustomRunner(actionContext.RequestType)
      ? new MyServiceRunner<TRequest>(this, actionContext)
      : base.CreateServiceRunner<TRequest>(actionContext);
}

答案 2 :(得分:2)

IHttpRequest具有OperationName。我认为那就是你追求的目标。