Uso l'hub SignalR nella mia applicazione MVC4. Ho aggiunto ELMAH per gestire tutti gli errori. il problema è che gli errori che si verificano nell'Hub non vengono registrati in ELMAH axd. C'è un modo per configurarlo?Come configurare ELMAH con SignalR
14
A
risposta
9
È necessario aggiungere un HubPipelineModule
e assicurarsi inoltre di impostare un NomeApplicazione nell'elemento errorLog, altrimenti Elmah non sarà in grado di registrare un errore, in quanto non avrà un HttpContext o un NomeApp per accedere a .
<errorLog type="Elmah.SqlErrorLog, Elmah" applicationName="MyAppName" connectionStringName="myConnString" />
Il HubPipelineModule code I've used è la seguente:
public class ElmahPipelineModule : HubPipelineModule
{
private static bool RaiseErrorSignal(Exception e)
{
var context = HttpContext.Current;
if (context == null)
return false;
var signal = ErrorSignal.FromContext(context);
if (signal == null)
return false;
signal.Raise(e, context);
return true;
}
private static void LogException(Exception e, IHubIncomingInvokerContext invokerContext)
{
var context = HttpContext.Current;
ErrorLog el = ErrorLog.GetDefault(context);
el.Log(new Error(e));
}
protected override void OnIncomingError(Exception ex, IHubIncomingInvokerContext context)
{
var exception = ex;
if (ex is TargetInvocationException)
{
exception = ex.InnerException;
}
else if (ex is AggregateException)
{
exception = ex.InnerException;
}
if (!RaiseErrorSignal(exception))
LogException(exception, context);
}
}
Assicurati di aggiungere il modulo alla pipeline hub:
GlobalHost.HubPipeline.AddModule(new ElmahPipelineModule());
EDIT
SignalR 2+
Ho notato che nessuna delle mie eccezioni SignalR è stata registrata in un progetto recente su cui ho lavorato e ho scoperto che viene generata un'eccezione ArgumentNullException quando si tenta di ottenere ErrorSignal dal contesto corrente. Il seguente metodo tratta correttamente questa eccezione in modo che gli errori SignalR vengano registrati nuovamente.
private static bool RaiseErrorSignal(Exception e)
{
var context = HttpContext.Current;
if (context == null)
return false;
try
{
var signal = ErrorSignal.FromCurrentContext();
if (signal == null)
return false;
signal.Raise(e, context);
return true;
}
catch (ArgumentNullException)
{
return false;
}
}
Problemi correlati
- 1. Come configurare Elmah con l'API Web ASP.NET
- 2. Come configurare ELMAH a livello di programmazione?
- 3. E 'possibile configurare ELMAH interamente nel codice?
- 4. Impossibile configurare la posta per Elmah
- 5. Come configurare ELMAH per funzionare con Windows Azure? Ottengo un 404 su Elmah.axd
- 6. Impossibile accedere/elmah sul server di produzione con Elmah MVC?
- 7. Come registrare le informazioni con Elmah
- 8. Registrazione errori client con Elmah
- 9. Uso di Redis con SignalR
- 10. Aiuto con configurazione Elmah in ASP.NET
- 11. SignalR con crittografia simmetrica
- 12. SignalR con Sockets Web
- 13. ELMAH - Filtro 404 Errori
- 14. Come utilizzare SignalR con ASP.NET 5
- 15. Installazione di Elmah con SQL Server 2008
- 16. SignalR in combinazione con Breeze
- 17. Client SignalR con più connessioni
- 18. Come proteggere Elmah su ASP.Net MVC 4 con Sicurezza integrata di Windows: Elmah ignora le mie impostazioni
- 19. dati personalizzati Elmah YSOD
- 20. File di configurazione esterna con elmah
- 21. SignalR: use camel case
- 22. Problemi con SignalR utilizzando NuGet
- 23. SignalR - Come disabilitare WebSockets
- 24. Come configurare Beanstalkd con PHP
- 25. Come configurare metaspace con SBT
- 26. come configurare cowboy con rebar3
- 27. Dove ELMAH salva i suoi dati?
- 28. elmah: eccezioni senza HttpContext?
- 29. SignalR con SSL autofirmato e self-host
- 30. filtraggio ELMAH non funziona
Per chiunque altro si blocchi nell'ultimo passaggio, aggiungere l'ultima riga alla classe RegisterHubs. Ad esempio: 'public static void Start() {RouteTable.Routes.MapHubs(); GlobalHost.HubPipeline.AddModule (new Shopperscape.Web.API.ElmahPipelineModule()); } ' – Chris
@Chris Funziona per SignalR 1.x? –
@Giles - questo codice è per SignalR 1 – damienc88