2015-04-21 70 views
4

我一直在努力的应用程序最近开始遇到间歇性硬崩溃,我无法解释。为了让这个更奇怪,我们设置了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()); 

这种方法清理到期的客户机错误(我们捕捉未处理的客户端错误客户端堆栈跟踪)。

+0

@ScottChamberlain我不知道是什么原因引起的,也可能是我们的任何控制器或可能signalr枢纽......这些都是唯一可以使用HttpListener的东西,但是我们有很多这样的东西。 – jonnii

+0

@ScottChamberlain我们没有异步无效,一切都会返回一个任务或任务。尽管我们有几个地方叫'Task.Run'。 – jonnii

+0

你是否保留'Task.Run'返回并等待任务的任务,或者你是否“做火和忘记”?如果失火并忘记,请展示一个用例。 (另外我删除了我的旧评论以清除空间) –

回答

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

你使用什么主机 - IIS,Self host?您使用的是什么类型的身份验证 - Windows,Cookie,JWT? – Jon

+0

SelfHost + Windows验证。 – jonnii

+0

我也是啊,不要以为你有我能看的片段? – Jon