IFeatureCollection удаляется Имя объекта: Коллекция в Задаче? - PullRequest
0 голосов
/ 03 августа 2020

Я хочу запустить Task, чтобы сохранить журналы в таблице базы данных.

Но похоже, что HttpContext удален в другом потоке.

Вот мой код:

_ = Task.Run(() =>
{
    using (var db = LogContext())
    {
        var request = new LoginLog
        {
            Url = context.HttpContext.Request.Path,
            UserAgent = context.HttpContext?.Request?.Headers?[HeaderNames.UserAgent].ToString()
        };
        await db.AddAsync(request);
        db.SaveChanges();
    }
});

Вот исключение trackInfo:

at Microsoft.AspNetCore.Http.Features.FeatureReferences`1.ThrowContextDisposed()
at Microsoft.AspNetCore.Http.Features.FeatureReferences`1.Fetch[TFeature, TState](TFeature & cached, TState state, Func`2 factory)
at Microsoft.AspNetCore.Http.DefaultHttpRequest.get_Path()
at PowerMan.Applet.Api.Infrastructure.Filters.RequestFilter.<> c__DisplayClass4_0.< OnActionExecutionAsync > b__1() in / Users / zhaojing / Projects / PowerMan.Api / PowerMan / PowerMan.Applet / PowerMan.Applet.Api / Infrastructure / Filters / RequestFilter.cs:line 112
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.<> c.<.cctor > b__274_0(Object obj)
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)

Это Задача, которая делает исключения?

1 Ответ

0 голосов
/ 03 августа 2020

Определенно контекст удаляется после завершения запроса. Таким образом, вам нужно будет захватить необходимые значения перед запуском фоновой операции:

var url = context.HttpContext.Request.Path;
var userAgent = context.HttpContext?.Request?.Headers?[HeaderNames.UserAgent].ToString();
_ = Task.Run(() =>
            {
                using (var db =LogContext())
                {
                    var request = new LoginLog
                    {
                        Url = url,
                        UserAgent = userAgent
                    };
                    await db.AddAsync(request);
                    db.SaveChanges();
                }
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...