【发布时间】:2016-08-18 15:17:04
【问题描述】:
我正在维护的 Web 表单项目中收到 NullReferenceExceptions。问题是这个异常没有堆栈跟踪,因为我的代码都没有导致异常。
复制到剪贴板的异常详细信息提供零帮助:System.NullReferenceException was unhandled
Message: An unhandled exception of type 'System.NullReferenceException' occurred in mscorlib.dll
Additional information: Object reference not set to an instance of an object.
当我查看非用户代码堆栈跟踪时,我看到以下内容(全部在 mscorlib 中):
错误随机且不一致地发生,无论是通过加载页面还是通过回发。在我添加 System.Net.Http.HttpClient 以从其他站点上公开的 REST 服务中提取数据之后,问题就开始了。请注意,HttpClient 仅包含用于发送/接收数据的异步方法。根据内部堆栈跟踪,我高度怀疑 Task / async / await 是罪魁祸首。
为了帮助进行故障排除,让我再次确认我是在一个使用 .NET 4.6 编译的 WebForms 站点中运行它(如果你要告诉我我的问题是我需要升级到 MVC,请保存你的击键不要说出来)。虽然 HttpClient 将所有内容公开为 Task,但我通过以下方式同步调用它们:Task<MyObject> myResultTask = restClient.GetResultAsync();
MyObject myResult = myResultTask.Result; // no await
提前致谢!
【问题讨论】:
-
只是调用等待大声笑
-
@RenéVogt 如果我没记错的话,你可以很容易地遇到各种奇怪的问题而无需等待
-
@JoeyHerrington:你有
targetFrameworkset to4.5or higher in yourweb.config吗? -
另外,你为什么首先使用
HttpClient?如果您需要同步 Web 请求,请使用WebClient。HttpClient是专门为async/await风格的代码设计的,而Result和朋友可以死锁。 -
@JoeyHerrington:从长远来看,我肯定会说使用
4.5并升级它破坏的东西。短期内您可以尝试设置aspnet:UseTaskFriendlySynchronizationContext(详情in the original blog post)。这可能有效。
标签: c# asp.net asynchronous nullreferenceexception mscorlib