我正在我们的一个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),但是由于该功能已经存在一段时间并且已被正确记录,所以我希望我们可以做一些事情以使其正常工作。