2015-05-07 10 views
7

sto correndo un WebAPI basato Owin SelfHost in cui ho messo in un'API non gestita logger eccezione tramiteOwin SelfHost WebApi: il client che chiude la connessione durante la risposta genera un'eccezione?

config.Services.Add(typeof(IExceptionLogger), _apiExceptionLogger); 

parte rilevante di ApiExceptionLogger:

public override void Log(ExceptionLoggerContext context) 
    { 
     if (context == null || context.ExceptionContext == null) return; 

     Logger.Error("Unhandled exception from Web API", context.ExceptionContext.Exception); 
    } 

I casi è la cattura e registrazione regolarmente vengono quelli in cui il client richiede un set di dati e quindi chiude la connessione mentre i risultati (JSON) vengono inviati indietro - persone che fanno una richiesta in chrome e quindi premendo il pulsante X prima che tutti i risultati tornino: P

Ho incollato uno stacktrace qui sotto per completezza, voglio solo sapere due cose:

  • È questo comportamento normale/previsto? AFAIK è ... Sto utilizzando una API e una pipeline predefinite
  • C'è un modo per gestire questo? In sostanza, interrompe l'elaborazione delle richieste in modo più agevole in caso di cancellazione (i token di cancellazione disseminati durante la pipeline della richiesta vengono in mente, ma non sembra che facciano molto in questo caso, dopo che tutti i token supportano solo la cancellazione cooperativa)

Non ho fatto alcun approfondimento sulla sequenza di eventi che si verificano a livello di socket, finora questo è solo un fastidio di registrazione.

System.Net.Http.HttpRequestException: Error while copying content to a stream. ---> System.IO.IOException ---> System.Net.HttpListenerException: The I/O operation has been aborted because of either a thread exit or an application request 
    at System.Net.HttpResponseStream.EndWrite(IAsyncResult asyncResult) 
    at Microsoft.Owin.Host.HttpListener.RequestProcessing.ExceptionFilterStream.EndWrite(IAsyncResult asyncResult) 
    --- End of inner exception stack trace --- 
    at Microsoft.Owin.Host.HttpListener.RequestProcessing.ExceptionFilterStream.EndWrite(IAsyncResult asyncResult) 
    at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization) 
    --- End of inner exception stack trace --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Web.Http.Owin.HttpMessageHandlerAdapter.<SendResponseContentAsync>d__20.MoveNext() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Web.Http.Owin.HttpMessageHandlerAdapter.<SendResponseContentAsync>d__20.MoveNext() 
+0

Sei stato fortunato ad identificare la condizione quando si verifica, ma sto ottenendo la stessa eccezione (con la stessa traccia di stack) senza alcuna ragione apparente. Succede di volta in volta in diversi thread di lavoro. Non influenza nulla, il cliente riceve risposta OK. – greatvovan

risposta

2

Ho avuto un problema simile con l'host Owin su Raspberry Pi. Questo può aiutare https://stackoverflow.com/a/30583109/1786034

+0

Grazie per aver guardato questo e aver risposto. Ma il gasdotto non si sta rompendo di per sé, sta andando tutto bene. Sto recuperando e registrando questi nel gancio di eccezione non gestito fornito da Owin, quindi non c'è bisogno di ingoiare e loggare per mantenere il pipe in esecuzione. Suppongo che non ci sia una risposta facile quindi, le disconnessioni client si propagano da HttpListener come eccezioni :( – Vivek

+0

Si può provare Nowin server (https://github.com/Bobris/Nowin). Apparentemente non usa HttpListener in modo che non possa soffrire da questo numero, tuttavia non è ancora pronto per la produzione. – zmechanic

Problemi correlati