![](/img/trans.png)
[英]Cannot consume scoped service 'MyDbContext' from singleton 'Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor'
[英]Environment specific error: Cannot consume scoped service from singleton 'Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor'
我开发了一个 .Net Core 后台服务,它在作为服务运行和在 Visual Studio 中调试时都运行良好。
然后开始发生以下错误,但仅在 Visual Studio 中进行调试时
Cannot consume scoped service myDbContext from singleton 'Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor'"
在部署时,服务不会遇到同样的问题。
我读过几篇文章说通过创建范围服务来解决这个问题,但是如果我通过从源代码管理中获取代码将项目设置在不同的机器上,则不会发生错误。
我已经从问题环境中删除了该项目,并再次从源代码管理中提取了代码,但问题仍然出现。
对我来说,这表明这是一个环境问题,而不是编码问题。
基本代码如下。
问题出现在行host.Run();
.
有没有人有任何关于如何隔离原因并因此可能找到解决方法的指示?
谢谢
public class Program
{
public static void Main(string[] args)
{
var method = MethodBase.GetCurrentMethod();
var methodName = method.Name;
var type = method.DeclaringType;
Log.Information("{0}.{1}: Started.", type, methodName);
try
{
var isService = !(Debugger.IsAttached || args.Contains("--console"));
if (isService)
{
var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
var pathToContentRoot = Path.GetDirectoryName(pathToExe);
Directory.SetCurrentDirectory(pathToContentRoot);
}
var builder = CreateWebHostBuilder(args.Where(arg => arg != "--console").ToArray());
var host = builder.Build();
if (isService)
{
host.RunAsWebCustomService();
}
else
{
host.Run();
}
return;
}
catch (Exception ex)
{
Log.Fatal(ex, "Error in {0{.{1}: {2}", type, methodName, ex.Message);
throw;
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
var method = MethodBase.GetCurrentMethod();
var methodName = method.Name;
var type = method.DeclaringType;
Log.Information("{0}.{1}:called", type, methodName);
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var builder = new ConfigurationBuilder()
.SetBasePath(Path.Combine(AppContext.BaseDirectory))
.AddJsonFile("appsettings.json", optional: true);
var configuration = builder.Build();
var url = configuration["WebHostBuilder:Url"];
return WebHost.CreateDefaultBuilder(args)
.UseUrls(url)
.ConfigureServices(
(hostContext, services) =>{services.AddHostedService<Worker>();})
.UseStartup<Startup>()
.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration));
}
}
我已经在 dotnet core 工作了 2 年,我发现的事情是:-
不要从单例解析范围服务。 可能会导致服务在处理后续请求时状态不正确。 没问题:
从作用域或瞬态服务解析单例服务。 从另一个范围服务或瞬态服务解析范围服务。 默认情况下,在开发环境中,从另一个生命周期较长的服务解析服务会引发异常。 有关更多信息, 范围验证
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.