为什么VS 2012将Type变量显示为NullReferenceException,同时还显示它是value = "Retailer"
。
我有一个新生儿,我正在努力限制睡眠,所以如果我遗漏了一些明显的东西,我会道歉。已经实例化了LoggedInUser.Employer对象,并且此行在1/2时间内工作正常。但随后它开始破裂。不确定这是否有帮助 - 需要睡觉......
private string _type;
public string Type
{
get { return _type; }
set
{
if (value != null)
{
TypeEnum = (Constants.BusinessType)Enum.Parse(typeof(Constants.BusinessType), value, true);
_type = value;
}
}
}
我开始怀疑这是否是一个跨线程的问题......
答案 0 :(得分:2)
负责存储ExecutionContext
实例的ASP.NET HttpContext.Current
自然不会“流”到其他线程。根据您的错误堆栈跟踪判断,您正在使用ASP.NET MVC,这是一个抽象使用HttpContext
的框架。你可能来自WebForms背景,它的直接使用是常见的吗?
This article提供了比我可以合理进行的更多细节。与您的情况最相关的一些要点是:
“ExecutionContext完全是关于”环境“信息,这意味着它存储与当前环境或您正在运行的”上下文“相关的数据。”
此“环境”信息为...... HttpContext.Current
及其各种属性(包括Session
)。
“这意味着我们依赖于控制执行细节的环境上下文不再可行,因为TLS不会”流过“这些异步点。” < / p>
TLS是线程本地存储(HttpContext.Current
等)。简而言之,async =可能会丢失HttpContext.Current
。
还记得我说MVC主要是摘录HttpContext
吗?
Session
位于Controller.Session。 (我很遗憾地说,我还没有在异步控制器操作中对此进行测试,因此无法验证它是否适合您的需求,或者您是否需要额外的工作才能使其合作。)
Request
位于Controller.Request
User
位于Controller.User
还有其他人...... check them out。
你考虑过其他选择吗?您不必远远地找到建议Session + ASP.NET MVC是一个坏主意的文章。我不打算对一些事情进行权衡,不管它是否是“坏事”,但看看你的例子,在我看来你处理的是用户档案数据,而不是“会话”数据。
会话实际上不是缓存用户个人资料信息的正确位置。就此而言,是否适合缓存它? 会话期间,用户个人资料是否可以更改?如果他们自己更改了,你会重置会话吗?如果单独的管理员用户在登录时更改了他们的个人资料,该怎么办?
探索替代方案超出了这个问题的范围,但是要小心你可能试图在这里解决错误的问题。
答案 1 :(得分:1)
String.IsNullOrEmpty不会在字符串上抛出此异常,即使它为null,因此Type属性不是问题。 LoggedInUser在没有错误之前使用了2行,因此将Employer属性作为罪魁祸首(除非String不是内置字符串)。
您可以在其上添加空格检查以确认:
if (LoggedInUser.Employer != null)
{
if (String.IsNullOrEmpty(LoggedInUser.Employer.Type))
{
...
}
}
else
{
// debug output
}
假设Employer为null,您需要在此处提供该属性定义。因为你只有在多个用户登录时才会看到这个,所以我怀疑它不应该是某个地方的静态声明。
答案 2 :(得分:0)
我的猜测是你在某个地方宣称一个名为&#34; String&#34; - 尝试使用小写&#34; string.IsNullOrEmpty&#34;或&#34; System.String.IsNullOrEmpty&#34;一个......