我一直在开发的应用程序最近开始遇到间歇性的硬崩溃,我无法解释。为了让这个更奇怪,我们同时设置了AppDomain.CurrentDomain.UnhandledException
和TaskScheduler.UnobservedTaskException
来捕捉这样的问题。
通常情况下,当出现问题时,上述两种方法都能正常工作,但在某些情况下,它们不会捕获未处理的异常。更糟糕的是,导致这种情况的例外是一个NRE,这意味着我们没有什么可以继续追踪的。
我的第一个想法是,也许我们在未处理的异常处理程序中的代码可能会抛出异常,所以我们在这里加倍处理异常,但到目前为止,这并没有产生任何影响。我们的原木也没能照亮这一切。
这可能是webapi和/或我们用来托管应用程序的owin位的一个bug,我将尝试取消依赖项以查看是否有帮助,但我认为这不会有任何区别。
是否有方法捕获线程池中发生的未处理异常?有没有什么诊断方法可以让我们得到更多的信息,知道这是在哪里发生的?
我没有办法了,任何帮助都将不胜感激。
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Net.HttpListener.EndGetContext(IAsyncResult asyncResult)
at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Microsoft.Owin.Host.HttpListener.OwinHttpListener.<ProcessRequestsAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__5(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
在使用任务时,我们不需要等待或挂起任务。这是:
Task.Run(() => CleanUpAllExpiredErrors());
此方法清除过期的客户端错误(我们捕获未处理客户端错误的客户端堆栈跟踪)。
最佳答案
通过添加大量的跟踪和日志记录,我们看到在为静态资产(特别是样式表)提供服务时,这种崩溃一直在发生。我们白名单我们的静态资产目录不需要认证和崩溃消失了。
我们通过执行以下操作将某些终结点配置为不需要身份验证:
var listener = (HttpListener)app.Properties["System.Net.HttpListener"];
listener.AuthenticationSchemeSelectorDelegate = request =>
{
// Options requests should always be anonymous otherwise preflight cors requests
// will fail in Firefox.
if (request.HttpMethod == "OPTIONS")
{
return AuthenticationSchemes.Anonymous;
}
// here we add additional whitelisted paths
var pathsWithoutAuthentication = KnownPaths.AnonymousWhiteList.Concat(KnownPaths.Assets);
return pathsWithoutAuthentication.Any(a => request.RawUrl.ToLower().StartsWith(a))
? AuthenticationSchemes.Anonymous
: AuthenticationSchemes.IntegratedWindowsAuthentication;
};
关于c# - 未捕获未处理的任务异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29773399/