在最近一次c#项目的开发中,当输入一个密码后我们会把这个密码保存在session中,以便后面进行验证。
但是在一次测试中发现在输入密码保存到session后,当跳转到另一页面后这时在进行密码的验证是。此时发现session的值是null
而当再开一个tab页时跳转到输入密码的界面时发现session中确实有password,但是到了下一页面进行验证是session有变为了null。
在上网查了后发现可能是如果sessionState的model是InProc可能由于杀毒软件或者是环境不稳定导致session丢失,但是在项目sessionState采用的SqlServer,所以这种可能性也别排除。最后在无意间发现在执行验证password的方法上加了ConfigureAwait(false),
1)当ConfigureAwait(true),设置为true时代码由同步执行进入异步执行时,当前同步执行的线程上下文信息(比如HttpConext.Current,Thread.CurrentThread.CurrentCulture)就会被捕获并保存至SynchronizationContext中,供异步执行中使用,并且供异步执行完成之后(await之后的代码)的同步执行中使用(虽然await之后是同步执行的,但是发生了线程切换,会在另外一个线程中执行「ASP.NET场景」)
2)当Configurewait(flase),则不进行线程上下文信息的捕获,async方法中与await之后的代码执行时就无法获取await之前的线程的上下文信息,在ASP.NET中最直接的影响就是HttpConext.Current的值为null。
因为在改异步方法上加了ConfigureAwait(false)导致该线程不会获取线程上下文的信息,所以在获取session时也找不到信息。
关于ConfigureAwait(false)的使用可以看看这篇文章