【问题标题】:ServiceStack request filter Attribute set a custom objectServiceStack request filter 属性设置自定义对象
【发布时间】:2015-05-06 13:39:03
【问题描述】:

我正在尝试编写将在每个服务上运行的自定义 RequestFilterAttribute,以检查请求是否具有有效令牌。我想在调用 CanExecute 方法后返回或设置一个对象,并将其转发给服务方法进行进一步处理。有没有办法在 ServiceStack 中做到这一点。

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    ServiceStack 请求过滤器可让您对请求进行短路,使其不再进行进一步处理,让请求通过您只需忽略该请求。对特定请求执行此操作的一种方法是让它们共享一个通用接口,您可以在请求过滤器中验证该接口,例如:

    public interface IValidateToken 
    {
        string Token { get; }
    }
    
    public class MyRequest : IValidateToken 
    {
        public string Token { get; set; }
    }
    

    然后在全局请求过滤器中,您可以验证令牌是否有效,否则返回错误并使用以下内容短路请求:

    GlobalRequestFilters.Add((httpReq, httpRes, dto) => {
        var tokenRequest = dto as IValidateToken;
        if (tokenRequest != null && !MyValidateToken(tokenRequest.Token))
        {
            httpRes.StatusCode = (int) HttpStatusCode.Forbidden;
            httpRes.StatusDescription = "Token is invalid";
            httpRes.EndRequest();
        }
    });
    

    如果请求令牌有效,则请求将正常处理。

    【讨论】:

    • 很酷,谢谢,在服务级别这样做有什么缺点吗?
    • 来到实例化自定义属性的问题。可以请求过滤器返回一个自定义对象以供服务方法使用。
    • 您可以修改过滤器中的请求dto,但不能将其替换为另一个实例。您可以通过重写 AppHost.OnPreExecuteServiceFilter() 来返回一个新实例,但它需要返回一个相同类型的实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2020-06-20
    • 1970-01-01
    • 2018-08-02
    • 2012-12-17
    • 2022-11-21
    • 2017-01-20
    相关资源
    最近更新 更多