请求过滤器是否从BasicAppHost运行?

时间:2015-05-04 21:41:25

标签: servicestack

我知道通过使用ConfigureContainer属性实例化BasicAppHost和IoC来获取服务,但是添加过滤器的地方在哪里?有问题的测试从未触发全局过滤器:

[TestFixture]
public class IntegrationTests
{
    private readonly ServiceStackHost _appHost;

    public IntegrationTests()
    {
        _appHost = new BasicAppHost(typeof(MyServices).Assembly)
        {
            ConfigureContainer = container =>
            {
                //
            }
        };
        _appHost.Plugins.Add(new ValidationFeature());
        _appHost.Config = new HostConfig { DebugMode = true };
        _appHost.GlobalRequestFilters.Add(ITenantRequestFilter);
       _appHost.Init();
    }

    private void ITenantRequestFilter(IRequest req, IResponse res, object dto)
    {
        var forTennant = dto as IForTenant;
        if (forTennant != null)
            RequestContext.Instance.Items.Add("TenantId", forTennant.TenantId);
    }

    [TestFixtureTearDown]
    public void TestFixtureTearDown()
    {
        _appHost.Dispose();   
    }

    [Test]
    public void CanInvokeHelloServiceRequest()
    {
        var service = _appHost.Container.Resolve<MyServices>();

        var response = (HelloResponse)service.Any(new Hello { Name = "World" });

        Assert.That(response.Result, Is.EqualTo("Hello, World!"));
    }

    [Test]
    public void CanInvokeFooServiceRequest()
    {
        var service = _appHost.Container.Resolve<MyServices>();

        var lead = new Lead
        {
            TenantId = "200"
        };

        var response = service.Post(lead); //Does not fire filter.
    }
}

ServiceStack设置为4.0.40

更新 在仔细阅读ServiceStack测试(我强烈推荐BTW)后,我遇到了一些正在使用和测试的AppHost示例。看起来“ConfigureAppHost”属性是配置过滤器的正确位置,例如

ConfigureAppHost = host =>
    {
        host.Plugins.Add(new ValidationFeature());
        host.GlobalRequestFilters.Add(ITenantRequestFilter);
    },
ConfigureContainer = container =>
    {
    }

Updated1 他们仍然不会开枪。

Updated2

经过一些试验和错误之后,我认为可以肯定地说NO,过滤器在使用BasicAppHost时没有连接。我为解决我的问题所做的是切换这些测试以使用继承自AppSelfHostBase的类,并使用c#servicestack客户端来调用我的服务上的方法。这确实会导致执行全局过滤器。

谢谢你, 斯蒂芬

1 个答案:

答案 0 :(得分:3)

请求和响应过滤器仅针对通过HTTP Request Pipeline执行HTTP请求的集成测试触发。如果您需要测试完整的请求管道,则需要使用自托管集成测试。

在服务上调用方法只是这样做,即它只是在自动服务的服务上进行C#方法调用 - 没有中间代理魔术拦截其间的调用。