Переменные сессии журнала nLog всегда пустые - PullRequest
0 голосов
/ 03 июля 2019

Я использую nLog в одном из наших веб-приложений.Он отлично работает для большинства переменных, которые мы регистрируем, но единственная, которую я не могу заставить работать для меня - это

$ {aspnet-session: variable = VarX}

Это всегда приводит к пустой строке, однако в веб-приложении VarX доступен в сеансе и имеет значение.

Я потерял ссылку (и), но я знаю / прочиталважно иметь правильный порядок промежуточного программного обеспечения в «Startup.cs» как в ConfigureServices, так и в Configure.

Во-первых, вызов «AddSession» должен быть после вызова «AddMvc», в последнем случае этонаоборот (из того, что я читал).Я установил для внутреннего журнала nLog значение «trace» и вижу, что значение пусто.

Во внутреннем журнале nLog ничего не зарегистрировано.

Сегодня я обновил NLog.Web.AspNetCore до версии 4.8.4.До этого было запись записей в журнале, что "Session Feature not сконфигурирован".Теперь это больше не делает.В журнале изменений для NLog.Web.AspNetCore 4.8.4 упоминается, что он улучшил это поведение, но мы все еще не можем получить переменные сеанса в регистраторе nLog.

    <target xsi:type="Database"
            name="database"
            dbProvider="sqlserver"
            connectionString="server=server;database=db;Integrated Security=False;User ID=user;Password=pw;multipleactiveresultsets=True"
            keepConnection="false"
            commandType="text">
      <commandText>
        INSERT INTO table (SessionVarX)
        VALUES (@SessionVarX);
      </commandText>
      <parameter name="@SessionVarX" layout="${aspnet-session:variable=SessionVarX}"/>
    </target>
private static readonly LoggerFactory _loggerFactory = new LoggerFactory(new[] { new NLogLoggerProvider() });

       public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                options.MinimumSameSitePolicy = SameSiteMode.Strict;
                options.Secure = CookieSecurePolicy.Always;
            });

            services.AddSingleton(Configuration);
            services.AddDbContextPool<DBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("string")).
                ConfigureWarnings(warnings => warnings.
                    Ignore(new EventId[] { CoreEventId.IncludeIgnoredWarning, RelationalEventId.BoolWithDefaultWarning, RelationalEventId.QueryClientEvaluationWarning })

                ).
                EnableDetailedErrors().
                UseLoggerFactory(_loggerFactory)
            );
            services.AddAntiforgery();
            services.AddMemoryCache();

            services.AddHsts(options =>
            {
                options.Preload = options.IncludeSubDomains = true;
                options.MaxAge = TimeSpan.FromDays(365);
            });

            services.AddMvc(config => { config.Filters.Add(new AuthenticationFilter()); }).
                SetCompatibilityVersion(CompatibilityVersion.Version_2_2).
                AddJsonOptions(x => x.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore).
                AddSessionStateTempDataProvider();

            services.AddHttpContextAccessor();

            services.AddSession(options =>
            {
                options.IdleTimeout = TimeSpan.FromMinutes(Configuration.Get<int>("SessionTimeoutInMinutes"));
                options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
                options.Cookie.IsEssential = true;
                options.Cookie.HttpOnly = true;
            });

       public void Configure(IApplicationBuilder app)
        {
            if (CurrentEnvironment.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error/Exception");
                app.UseHsts();
            }

            app.UseStatusCodePagesWithReExecute("/Error", "?code={0}");
            app.UseSession();
            app.UseHttpsRedirection();

            app.UseStaticFiles(new StaticFileOptions
            {
                OnPrepareResponse = ctx =>
                {
                    //Cache static files for a week
                    ctx.Context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.CacheControl] = "public,max-age=604800";
                }
            });

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
                routes.MapRoute(
                    name: "areas",
                    template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
                );
            });
        }

Ожидаемый результат - регистрация SessionVarXфактический результат - пустая строка. Таким образом, записи создаются (регистрируется больше), однако переменные сеанса всегда пусты .В настоящее время во внутреннем журнале nLog нет ошибок.Ранее этот журнал показывал «Функция сеанса не настроена».

Любая помощь будет принята с благодарностью!Вполне может быть, что эта функция все еще дорабатывается (глядя на netle Issetracker), но, поскольку она уже существует в течение некоторого времени и должным образом задокументирована, я надеюсь, что мы сможем что-то сделать, чтобы она заработала.

...