.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