asp.net – 静态方法中的HttpContext.Current NullReferenceExce
我有一个静态类,有几个静态方法.在这些方法中,我试图使用HttpContext.Current访问当前线程的上下文.例如:
var userName = HttpContext.Current.User.Identity.Name; 但是,当我这样做时,我收到一个NullReferenceException,臭名昭着的“对象引用未设置为对象的实例”. 有任何想法吗? 解决方法
从原始帖子中不清楚HttpContext实际上是什么缺失. HttpContext.User属性在生命周期的某些阶段也可以为null,这将为您提供完全相同的异常.除了所有其他问题之外,您需要逐步查看源代码并查看表达式的哪个部分实际上为null.
当您编写引用静态方法/属性(如HttpContext.Current)的代码时,您必须编写它们,因为它们知道在方法/属性实际可用时无法保证运行代码.通常你有这样的事情: static string GetCurrentUserName() { HttpContext context = HttpContext.Current; if (context == null) return null; IPrincipal user = context.User; if (user == null) return null; return user.Identity.Name; } 虽然我怀疑这不会真正解决你的问题,但它只会摆脱异常.问题更可能是您在上下文根本不可用的时间或地点调用此方法,例如在后台线程,静态构造函数或字段初始化程序,或Application_BeginRequest方法或某些类似的位置. 我可能首先将静态方法更改为依赖于HttpContext实例的类的实例方法(即在构造函数中采用).很容易欺骗自己认为像GetCurrentUserName这样的方法是简单的“实用”方法,但它们实际上并非如此,并且通过静态属性从任何你不喜欢的地方调用引用HttpContext.Current的方法通常是无效的.已经有一个对同一个HttpContext的实例引用(即来自Page类).如果你开始重写这样的类,可能性是: public class UserResolver { private HttpContext context; public UserResolver(HttpContext context) { if (context == null) throw new ArgumentNullException("context"); this.context = context; } public string GetUserName() { return (context.User != null) ? context.User.Identity.Name : null; } } …那么你很可能会很快发现链被破坏的位置,这将是你需要引用HttpContext.Current的点,因为你无法从其他任何地方获取它. 在这种特定情况下,显然,您可以通过获取NullReferenceException的堆栈跟踪来找出链开始的位置/时间来解决问题,因此您不必进行上面描述的更改 – 我是简单地推荐一种有助于在将来减少这类“遗失单身”错误的一般方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 单元测试 – 使用MOQ对象进行ASP.NET MVC单元测试
- 如何从经典ASP输出Excel * .xls文件
- Hangfire在ASP.NET CORE中的简单实现
- 如何在ASP.NET ListBox中设置多个选择?
- iis – 我应该为我的生产服务器使用processModel autoConfi
- asp.net-mvc – MVC控制器操作参数为null
- asp.net-mvc – 在mvc 4上获取当前文化或浏览器区域设置
- asp.net-mvc – MVC 4:强制ScriptBundle返回Javascript文件
- asp.net – Web api界面在本地工作,但不在Azure上
- asp.net-mvc – 传递子对象问题的嵌套部分视图
- asp.net-mvc-3 – ASP.NET MVC 3一对多无法更新桥
- asp.net – MS Web部署跳过删除规则不跳过
- Visual Studio 2017下ASP.NET CORE的TagHelper智
- asp.net-mvc – 在ASP.NET MVC 5 ActionLink中包
- Asp.net:实现自动注销功能
- asp.net – 运行时从Microsoft.AspNet.WebApi.He
- ASP.Net应用程序的最佳菜单是什么?
- asp.net-mvc – mvc将多个参数传递给局部视图
- ASP.NET MVC实现简单的文件上传与下载
- asp.net-mvc-3 – 如何使用ViewBag属性从我的Vie