fix: PlatformHttpClientFactory uses IServiceScopeFactory to avoid disposed DbContext in danmaku retry
PlatformHttpClientFactory was holding a direct ISystemSettingsService reference (Scoped). When the danmaku connection's request scope ended, retry attempts failed with ObjectDisposedException on LiveRecorderDbContext. Changed to use IServiceScopeFactory to create a fresh scope on each CreateAsync call, so the danmaku retry loop always gets a live DbContext. Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
This commit is contained in:
co-authored by
Claude Opus 4.8 noreply@anthropic.com
parent
24e5cf2a06
commit
524a053263
@@ -5,6 +5,7 @@ using LiveRecorder.Application.Common;
|
|||||||
using LiveRecorder.Application.Abstractions.Settings;
|
using LiveRecorder.Application.Abstractions.Settings;
|
||||||
using LiveRecorder.Application.Models.Settings;
|
using LiveRecorder.Application.Models.Settings;
|
||||||
using LiveRecorder.Domain.Enums;
|
using LiveRecorder.Domain.Enums;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace LiveRecorder.Infrastructure.Services;
|
namespace LiveRecorder.Infrastructure.Services;
|
||||||
|
|
||||||
@@ -13,11 +14,11 @@ public sealed class PlatformHttpClientFactory
|
|||||||
private static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(20);
|
private static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(20);
|
||||||
private static readonly TimeSpan DefaultConnectTimeout = TimeSpan.FromSeconds(10);
|
private static readonly TimeSpan DefaultConnectTimeout = TimeSpan.FromSeconds(10);
|
||||||
|
|
||||||
private readonly ISystemSettingsService _systemSettingsService;
|
private readonly IServiceScopeFactory _serviceScopeFactory;
|
||||||
|
|
||||||
public PlatformHttpClientFactory(ISystemSettingsService systemSettingsService)
|
public PlatformHttpClientFactory(IServiceScopeFactory serviceScopeFactory)
|
||||||
{
|
{
|
||||||
_systemSettingsService = systemSettingsService;
|
_serviceScopeFactory = serviceScopeFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<HttpClient> CreateAsync(
|
public async Task<HttpClient> CreateAsync(
|
||||||
@@ -25,7 +26,9 @@ public sealed class PlatformHttpClientFactory
|
|||||||
bool forceDirectConnection,
|
bool forceDirectConnection,
|
||||||
CancellationToken cancellationToken = default)
|
CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
var settings = await _systemSettingsService.GetAsync(cancellationToken);
|
using var scope = _serviceScopeFactory.CreateScope();
|
||||||
|
var systemSettingsService = scope.ServiceProvider.GetRequiredService<ISystemSettingsService>();
|
||||||
|
var settings = await systemSettingsService.GetAsync(cancellationToken);
|
||||||
var proxy = forceDirectConnection ? null : BuildProxy(platform, settings);
|
var proxy = forceDirectConnection ? null : BuildProxy(platform, settings);
|
||||||
var handler = new SocketsHttpHandler
|
var handler = new SocketsHttpHandler
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user