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