ServiceStack:访问服务中的IRequest返回null

时间:2019-02-23 10:56:59

标签: servicestack

我正在使用Servicestack。我的服务有一个基类,就像这样:

public abstract class ServiceHandlerBase : Service

,然后关注其中的一些方法和属性。我已经有几种方法可以访问IRequest对象,例如:

    protected AlfaOnline GetContactItem()
    {
        string deviceUUID = Request.Headers.Get(Constants.DEVICE_UUID); // <-- calling this method from constructor will give NullRef on Request here
        string authToken = Request.Headers.Get(Constants.AUTH_TOKEN);
        // do stuff
        return existingContactItem;
    }

在我的服务实现中运行良好,在那里没有问题。

现在,我想直接从基类中使用完全相同的方法 ,在构造函数中调用它:

    public ServiceHandlerBase()
    {
        AlfaOnline ao = GetContactItem();
    }

但是如上所述,我然后在NullReferenceException对象上得到了一个Request

何时可以访问和使用Request对象?因为在服务实现中它不是null。

1 个答案:

答案 0 :(得分:1)

在注入之前,您无法在构造函数中访问任何依赖,例如IRequest,只有在初始化Service类之后(如调用Service方法时),才能访问它们。

您可以在执行任何服务之前使用Custom Service Runner执行自定义逻辑,例如:

public class MyServiceRunner<T> : ServiceRunner<T> 
{
    public override void OnBeforeExecute(IRequest req, TRequest requestDto) {
      // Called just before any Action is executed
    }
}

并使用以下命令在您的AppHost中向ServiceStack注册:

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext ctx)
{           
    return new MyServiceRunner<TRequest>(this, ctx);
}

但是,如果您只想为Service类运行一些逻辑,则可以在基类中覆盖OnBeforeExecute(),例如:

public abstract class ServiceHandlerBase : Service
{
    public override void OnBeforeExecute(object requestDto)
    {
        AlfaOnline ao = GetContactItem();
    }
}    

有关有效的示例,请参见ServiceFilterTests.cs

如果您要实现IService而不是继承Service基类,则可以实现IServiceBeforeFilter

新的服务过滤器可从v5.4.1(现在为available on MyGet)中获得。