nLog日志记录会话变量始终为空

时间:2019-07-03 11:35:51

标签: c# session logging nlog asp.net-core-2.2

我正在我们的一个Web应用程序中使用nLog。

,它对于我们正在记录的大多数变量都非常有效,但是我无法生存的唯一变量是

$ {aspnet-session:variable = VarX}

这将始终导致一个空字符串,但是在Web应用程序中,可以在会话中访问VarX并具有一个值。

我丢失了链接,但是我知道/阅读了在ConfigureServices和Configure中的“ Startup.cs”中正确设置中间件的顺序很重要。

首先,“ AddSession”调用必须在“ AddMvc”调用之后,而在另一方面,这是另一种方式(从我读到的内容)。 我将nLog的内部日志设置为“ trace”,我可以看到该值为空。

nLog的内部日志中没有其他记录。

今天,我已将NLog.Web.AspNetCore更新为4.8.4。在将条目写入“未配置会话功能”的日志之前。现在,它不再这样做了。 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的内部日志中没有记录错误。以前该日志显示“会话功能未配置”。

任何帮助将不胜感激!很有可能该功能仍在被淘汰(请参阅nLog issuetracker),但是由于该功能已经存在一段时间并且已被正确记录,所以我希望我们可以做一些事情以使其正常工作。

0 个答案:

没有答案