16

MVC4 アプリケーションで SignalR ハブを使用しています。すべてのエラーを処理するために ELMAH を追加しました。問題は、Hub で発生したエラーが ELMAH axd に記録されないことです。それを構成する方法はありますか?

4

1 に答える 1

11

を追加するHubPipelineModule必要があり、また、errorLog 要素に ApplicationName を設定する必要があります。そうしないと、Elmah は HttpContext またはログ先の AppName を持たないため、エラーをログに記録できません。

<errorLog type="Elmah.SqlErrorLog, Elmah" applicationName="MyAppName" connectionStringName="myConnString" />

私が使用したHubPipelineModule コードは次のとおりです。

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

モジュールをハブ パイプラインに追加してください。

GlobalHost.HubPipeline.AddModule(new ElmahPipelineModule()); 

編集

シグナルR 2+

私が取り組んでいる最近のプロジェクトでは、SignalR 例外がログに記録されていないことに気付きました。現在のコンテキストから ErrorSignal を取得しようとすると、ArgumentNullException がスローされることがわかりました。次のメソッドは、SignalR エラーが再度ログに記録されるように、この例外を適切に処理します。

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;
    }
}
于 2013-06-26T04:55:59.317 に答える