2015-04-21 2 views
4

Приложение, над которым я работал, недавно начал испытывать прерывистые жесткие сбои, которые я не могу объяснить. Чтобы сделать это более странным, у нас есть как AppDomain.CurrentDomain.UnhandledException, так и TaskScheduler.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 у нас нет async void, все либо возвращает задачу, либо задачу . Есть несколько мест, где мы называем «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 Auth. – jonnii

+0

А я тоже, не думаю, что у вас есть фрагмент, на который я мог бы смотреть? – Jon

Смежные вопросы