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

Do the Request filters get run from BasicAppHost?

我知道通过实例化 BasicAppHost 和 IoC 通过使用 ConfigureContainer 属性 来连接服务,但是添加过滤器的正确位置在哪里?有问题的测试从不触发全局过滤器:

[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 =>
    {
    }

已更新1 而且他们仍然不开火。

已更新2

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

谢谢, 斯蒂芬

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

在服务上调用方法就是这样做的,也就是说,它实际上只是在自动装配的服务上进行 C# 方法调用 - 中间没有中间代理魔术拦截调用。