远程调试方式 (加微信红包) 可追加
HttpContext.User as UserInfo 刷新几次,登录获取用户信息放入cache中,上线后,点击几次中间有偶尔几次 HttpContext.User as UserInfo结果为null
file: Global.asax
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
try
{
var app = (HttpApplication)sender;
if (!app.Context.User.Identity.IsAuthenticated) return;
var user = _repository.FindCustomer(app.Context.User.Identity.Name, BasesController.System.AgentId);
if (null == user) return;
app.Context.User = user;
Thread.CurrentPrincipal = user;
}
catch (Exception ex)
{
Logs.WriteLog(typeof(MvcApplication), ex);
}
}
谢谢各位,是由于IIS的 账号权限问题。 对ASP.NET 瞬间无爱。 正式上线项目切记添加 IUSR账号,别问为什么,血的教训。
我怎么以前遇到这个问题时候好像不是 没有加IUSR 问题。
你线上是不是有负载均衡?而且你HttpContext.User是如何从请求中获取的?
web只是架在一个iis上吗?有没有做负载均衡?
你好
有一个nginx 做了 代理分发。单IIS运行也是有这个情况的。 具体情况参考上面兄弟我的回复。
谢谢
问题1: HttpContext.User as UserInfo 为null的时候 缓存里面还有没有值
问题2:HttpContext.User as UserInfo 为null的时候 有没有执行以下代码
app.Context.User = user;
问题3:如果 app.Context.User = user; 每次都执行了 而后面 as又为空 那么需要验证 在这个过程中有没有 new一个新的httpcontext
ps:关于问题3 我这里就直接问了 你用了mvc的服务器端跳转没 我印象当中 mvc的服务器端跳转 会初始化一个新的httpcontext 导致前一个 httpcontext的值丢失
ps:所以一般我的这钟生命周期级别的 变量 不放在httpcontext里 一般我都放在当前线程里面 threadstatic(好像叫这个)
问题4:后面你再调用的时候 是不是另起了一个线程 因为我记得 开新线程的话 httpcontext 会失效
@游子善心: 通过threadid 来区分 当前请求前后关系
@游子善心: 多线程 并发这个级别的问题 要记录日志 不记录日志 神仙也救不了你
把方法加上同步试试? 或者多部署到几台电脑上当服务器 然后再挂到nginx上 这样才算负载均衡