请求过滤器是否从 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# 方法调用 - 中间没有中间代理魔术拦截调用。
我知道通过实例化 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# 方法调用 - 中间没有中间代理魔术拦截调用。