未捕获未处理的任务异常

时间:2015-04-21 13:20:00

标签: c# exception asp.net-web-api task-parallel-library owin

我一直在努力的应用程序最近开始出现间歇性的硬碰撞,我无法解释。为了使这更奇怪,我们设置AppDomain.CurrentDomain.UnhandledExceptionTaskScheduler.UnobservedTaskException来捕捉这些问题。

通常当出现问题时,上述两个工作正常,但我们在某些情况下没有捕获未处理的异常。为了使事情变得更糟,造成这种情况的例外是一个NRE,这意味着我们在追踪正在发生的事情方面没有任何进展。

我的第一个想法是,我们在未处理的异常处理程序中的代码可能会抛出异常,所以我们在这里加倍了异常处理,但到目前为止还没有任何区别。我们的原木还没有能够对此发光。

这可能是我们用来托管应用程序的webapi和/或owin位的错误,我将尝试碰撞依赖关系,看看是否有帮助,但我不认为它会有所作为。

有没有办法捕获线程池中发生的未处理异常?我们是否可以通过某种诊断方法获取有关这种情况的更多信息?

我在我的智慧结束时,我们将非常感谢任何帮助。

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()

使用任务时,我们不会async void,但我们有一个Task.Run的案例,我们不会等待或挂起任务。这是:

Task.Run(() => CleanUpAllExpiredErrors());

此方法清除过期的客户端错误(我们捕获未处理的客户端错误上的客户端堆栈跟踪)。

1 个答案:

答案 0 :(得分:3)

通过添加广泛的跟踪和日志记录,我们发现在提供静态资产(特别是样式表)时,此崩溃一直在发生。我们将静态资产目录列入白名单,不需要身份验证,崩溃就消失了。

我们通过执行以下操作将某些端点配置为不需要身份验证:

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;
};