.NET Core 3.1 是否支持 ReuseScope.Request?
Is ReuseScope.Request supported on .NET Core 3.1?
我们在 ServiceStack 应用程序(IIS 中的 v5.8 运行)上遇到错误,似乎请求在并发执行时混淆了。
我已经成功地通过一个简单的控制台应用程序相当可靠地重现了:
Parallel.ForEach(cfg.Emails, email =>
{
var client = new JsonServiceClient(cfg.ApiBaseUrl);
client.Timeout = TimeSpan.FromHours(1);
AuthUser(client, email);
GetUser(client, email);
});
GetUser
returns 经过身份验证的用户并检查它是否与预期的电子邮件地址匹配。一次触发 4 或 5 个请求会导致每两次运行至少有一个失败。
当前用户被注入到服务的构造函数中,使用如下容器配置:
container.Register<User>(x => container.Resolve<IDatabaseContext>().GetUser()).ReusedWithin(ReuseScope.Request);
IDatabaseContext 也配置为按请求重复使用:
container.Register<IDatabaseContext>(x =>
new DbContext(container.TryResolve<IRequest>())).ReusedWithin(ReuseScope.Request);
似乎试图从容器解析 IRequest 是不可靠的。我认为服务方法中的这个简单代码证明:
var r = _container.Resolve<IRequest>();
var cookie = Request.GetSessionId();
var otherCookie = r.GetSessionId();
if (cookie != otherCookie) throw new Exception("oh noes!");
问题是:这应该得到支持吗?这里的文档 https://docs.servicestack.net/ioc 建议如此(强调我的):
ServiceStack uses a slightly modified version of Funq - which was adopted because of its excellent performance and memory characteristics. ServiceStack’s version of Funq has been enhanced with Expression-based Auto-wiring and lifetime Request Scope.
然而,四处搜索导致 https://forums.servicestack.net/t/reusescope-request/6384 似乎在说“不要使用请求范围”。
该问题试图将 IRequest
作为 IOC 依赖项解决,因为它不是在 IOC 中注册或访问的依赖项。
IRequest
是仅在运行时可用的请求上下文,通常从您的服务中的 base.Request
访问,您将作为参数传递给您的依赖项,而不是作为在其期间注入的依赖项建筑。
虽然支持请求范围,但它是 definitely not recommended especially for trying to access the HTTP Request Context from a static context which is disabled by default in .NET Core。
我们在 ServiceStack 应用程序(IIS 中的 v5.8 运行)上遇到错误,似乎请求在并发执行时混淆了。
我已经成功地通过一个简单的控制台应用程序相当可靠地重现了:
Parallel.ForEach(cfg.Emails, email =>
{
var client = new JsonServiceClient(cfg.ApiBaseUrl);
client.Timeout = TimeSpan.FromHours(1);
AuthUser(client, email);
GetUser(client, email);
});
GetUser
returns 经过身份验证的用户并检查它是否与预期的电子邮件地址匹配。一次触发 4 或 5 个请求会导致每两次运行至少有一个失败。
当前用户被注入到服务的构造函数中,使用如下容器配置:
container.Register<User>(x => container.Resolve<IDatabaseContext>().GetUser()).ReusedWithin(ReuseScope.Request);
IDatabaseContext 也配置为按请求重复使用:
container.Register<IDatabaseContext>(x =>
new DbContext(container.TryResolve<IRequest>())).ReusedWithin(ReuseScope.Request);
似乎试图从容器解析 IRequest 是不可靠的。我认为服务方法中的这个简单代码证明:
var r = _container.Resolve<IRequest>();
var cookie = Request.GetSessionId();
var otherCookie = r.GetSessionId();
if (cookie != otherCookie) throw new Exception("oh noes!");
问题是:这应该得到支持吗?这里的文档 https://docs.servicestack.net/ioc 建议如此(强调我的):
ServiceStack uses a slightly modified version of Funq - which was adopted because of its excellent performance and memory characteristics. ServiceStack’s version of Funq has been enhanced with Expression-based Auto-wiring and lifetime Request Scope.
然而,四处搜索导致 https://forums.servicestack.net/t/reusescope-request/6384 似乎在说“不要使用请求范围”。
该问题试图将 IRequest
作为 IOC 依赖项解决,因为它不是在 IOC 中注册或访问的依赖项。
IRequest
是仅在运行时可用的请求上下文,通常从您的服务中的 base.Request
访问,您将作为参数传递给您的依赖项,而不是作为在其期间注入的依赖项建筑。
虽然支持请求范围,但它是 definitely not recommended especially for trying to access the HTTP Request Context from a static context which is disabled by default in .NET Core。