C# 无法访问ASP.NET核心后台服务中已释放的对象
我试图弄清楚为什么我的数据库上下文会被下面的代码破坏。我试图在整个处理阶段更新记录的状态,但在尝试保存对htis实体的状态字段的更改时出现异常 在.SaveChanges()或.FirstOrDefault()调用上使用异步或非异步方法没有区别 这已注册为由IHostedService运行 IHostedService:C# 无法访问ASP.NET核心后台服务中已释放的对象,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我试图弄清楚为什么我的数据库上下文会被下面的代码破坏。我试图在整个处理阶段更新记录的状态,但在尝试保存对htis实体的状态字段的更改时出现异常 在.SaveChanges()或.FirstOrDefault()调用上使用异步或非异步方法没有区别 这已注册为由IHostedService运行 IHostedService: public class HostedDaemon : IHostedService { private readonly ILogger<HostedDaemo
public class HostedDaemon : IHostedService
{
private readonly ILogger<HostedDaemon> _logger;
private Timer _queueTimer;
private Timer _runTimer;
private IServiceProvider Services { get; set; }
public HostedDaemon(IServiceProvider services, ILogger<HostedDaemon> logger)
{
Services = services;
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
var queueAutoEvent = new AutoResetEvent(false);
_logger.LogInformation("HostedDaemon Starting");
_queueTimer = new Timer(QueueJobs, queueAutoEvent, TimeSpan.Zero,
TimeSpan.FromSeconds(900));
_runTimer = new Timer(RunQueuedJobs, queueAutoEvent, TimeSpan.Zero,
TimeSpan.FromSeconds(10));
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("HostedDaemon Stopping");
_queueTimer?.Change(Timeout.Infinite, 0);
_runTimer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_queueTimer?.Dispose();
_runTimer?.Dispose();
}
private void QueueJobs(object stateInfo)
{
using (var scope = Services.CreateScope())
{
var autoEvent = (AutoResetEvent)stateInfo;
var daemonProcessing = scope.ServiceProvider.GetRequiredService<IDaemonService>();
//daemonProcessing.QueueJob();
//daemonProcessing.RunJob();
autoEvent.Set();
}
}
private void RunQueuedJobs(object stateInfo)
{
using (var scope = Services.CreateScope())
{
var autoEvent = (AutoResetEvent)stateInfo;
var daemonProcessing = scope.ServiceProvider.GetRequiredService<IDaemonService>();
//daemonProcessing.QueueJob();
daemonProcessing.RunJob();
autoEvent.Set();
}
}
}
启动配置:
public void ConfigureServices(IServiceCollection services)
{
DynamicsAccountGuid = Configuration["Services:Dynamics:AccountGuid"];
DynamicsCompany = Configuration["Services:Dynamics:Companies:Development"];
DynamicsBasicAuth = Configuration["Services:Dynamics:BasicAuth"];
ConnectionString = Configuration["ConnectionStrings:FIS_Local"];
services.AddSingleton(Configuration);
services.AddEntityFrameworkSqlServer()
.AddDbContext<FisEntities>(options => options.UseSqlServer(ConnectionString));
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddHttpClient<IRequestClient, DynamicsClient>("dynamics", d =>
{
d.BaseAddress = new Uri($"https://api.businesscentral.dynamics.com/v1.0/{DynamicsAccountGuid}/api/beta/companies/{DynamicsCompany}");
d.DefaultRequestHeaders.Add("Authorization", DynamicsBasicAuth);
});
services.AddTransient<IQueueClient, CrmClient>();
services.AddHostedService<HostedDaemon>();
services.AddScoped<IDaemonService, TransactionService>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void配置服务(IServiceCollection服务)
{
DynamicsAccountGuid=配置[“服务:动态:AccountGuid”];
dynamiccompany=Configuration[“服务:动态:公司:开发”];
DynamicsBasicAuth=配置[“服务:动态:BasicAuth”];
ConnectionString=配置[“ConnectionString:FIS_Local”];
services.AddSingleton(配置);
services.AddEntityFrameworkSqlServer()
.AddDbContext(options=>options.UseSqlServer(ConnectionString));
配置(选项=>
{
//此lambda确定给定请求是否需要非必要cookie的用户同意。
options.checkApprovered=context=>true;
options.MinimumSameSitePolicy=SameSiteMode.None;
});
services.AddHttpClient(“dynamics”,d=>
{
d、 BaseAddress=新Uri($”https://api.businesscentral.dynamics.com/v1.0/{DynamicsAccountGuid}/api/beta/companys/{DynamicsCompany}”);
d、 DefaultRequestHeaders.Add(“授权”,dynamicBasicAuth);
});
services.AddTransient();
services.AddHostedService();
services.addScope();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
在HostedDaemon
类中的RunQueuedJobs
方法中,替换daemonProcessing.RunJob()代码>与daemonProcessing.RunJob().Wait()一起使用代码>如下所示:
private void RunQueuedJobs(object stateInfo)
{
using (var scope = Services.CreateScope())
{
var autoEvent = (AutoResetEvent)stateInfo;
var daemonProcessing = scope.ServiceProvider.GetRequiredService<IDaemonService>();
//daemonProcessing.QueueJob();
daemonProcessing.RunJob().Wait(); // <-- Here it is
autoEvent.Set();
}
}
private void RunQueuedJobs(对象状态信息)
{
使用(var scope=Services.CreateScope())
{
var autoEvent=(AutoResetEvent)stateInfo;
var daemonProcessing=scope.ServiceProvider.GetRequiredService();
//daemonProcessing.QueueJob();
daemonProcessing.RunJob().Wait();//获取异常时,请记住将实际的错误消息发布到问题中。从上面的内容来看,任何内容都不应处理上下文我获取异常
-为什么不将异常消息添加到问题中?请将整个异常消息添加到问题中,并使用整个方法排除方法签名。您是否碰巧使用了Oracle的某个旧的/时髦的MySQL提供程序?@Gibbon这是一个通用对象处理异常,但我已经添加了其中的文本。@TanvirArjel添加了,但它是通用的
public void ConfigureServices(IServiceCollection services)
{
DynamicsAccountGuid = Configuration["Services:Dynamics:AccountGuid"];
DynamicsCompany = Configuration["Services:Dynamics:Companies:Development"];
DynamicsBasicAuth = Configuration["Services:Dynamics:BasicAuth"];
ConnectionString = Configuration["ConnectionStrings:FIS_Local"];
services.AddSingleton(Configuration);
services.AddEntityFrameworkSqlServer()
.AddDbContext<FisEntities>(options => options.UseSqlServer(ConnectionString));
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddHttpClient<IRequestClient, DynamicsClient>("dynamics", d =>
{
d.BaseAddress = new Uri($"https://api.businesscentral.dynamics.com/v1.0/{DynamicsAccountGuid}/api/beta/companies/{DynamicsCompany}");
d.DefaultRequestHeaders.Add("Authorization", DynamicsBasicAuth);
});
services.AddTransient<IQueueClient, CrmClient>();
services.AddHostedService<HostedDaemon>();
services.AddScoped<IDaemonService, TransactionService>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
private void RunQueuedJobs(object stateInfo)
{
using (var scope = Services.CreateScope())
{
var autoEvent = (AutoResetEvent)stateInfo;
var daemonProcessing = scope.ServiceProvider.GetRequiredService<IDaemonService>();
//daemonProcessing.QueueJob();
daemonProcessing.RunJob().Wait(); // <-- Here it is
autoEvent.Set();
}
}