C# 未捕获未处理的任务异常

C# 未捕获未处理的任务异常,c#,exception,asp.net-web-api,task-parallel-library,owin,C#,Exception,Asp.net Web Api,Task Parallel Library,Owin,我一直在开发的应用程序最近开始出现间歇性的硬崩溃,我无法解释。为了让这更奇怪,我们设置了AppDomain.CurrentDomain.UnhandledException和TaskScheduler.UnobservedTaskeException来捕获类似的问题 通常当出现问题时,上述两种方法可以正常工作,但在某些情况下,它们无法捕获未处理的异常。更糟糕的是,造成这种情况的例外是NRE,这意味着我们在追踪发生的事情方面没有任何进展 我的第一个想法是,我们在未处理的异常处理程序中拥有的代码可能

我一直在开发的应用程序最近开始出现间歇性的硬崩溃,我无法解释。为了让这更奇怪,我们设置了
AppDomain.CurrentDomain.UnhandledException
TaskScheduler.UnobservedTaskeException
来捕获类似的问题

通常当出现问题时,上述两种方法可以正常工作,但在某些情况下,它们无法捕获未处理的异常。更糟糕的是,造成这种情况的例外是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()

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

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

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

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

@ScottChamberlain我不确定是什么原因造成的,可能是我们的任何控制器或信号集线器。。。这些是唯一可以使用HttpListener的东西,但是我们有很多。@ScottChamberlain我们没有异步void,所有东西要么返回一个任务,要么返回一个任务。有几个地方我们称之为
Task.Run
。您是保留
Task.Run
返回的任务并等待任务,还是执行“发射并忘记”?如果点火并忘记,则显示一个使用示例。(同时我正在删除我的旧评论以清理空间)我将更新question@ScottChamberlain完成您使用的主机-IIS,自主机?您使用的是哪种身份验证-Windows、Cookie、JWT?SelfHost+Windows Auth。完全不知道为什么或如何发生,只是找到了一种修复方法并继续前进。@Ericrichards是的,这并没有为我们修复它,但我们几乎每天都会看到它,目前还不知道原因:(有人知道这件事的真相吗?现在它正在咬我们,使用所有Microsoft.OWIN.*的v3.0.0版本。
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;
};