2

さて、私はこれと文脈の質問に名前を付けるつもりでしたが、どうやら質問という言葉はタイトルでは許可されていません.

とにかく、ここに問題がIErrorHandlerあります。すべてのサービス コードを乱雑にすることなくログを提供するために、WCF サービスで使用しています。これまでのところ、これはうまく機能しています。ただし、完全に非同期のサービスに移行しようとしている今call stack、因果連鎖ではなくリターン スタックであるという問題に直面しています。

ここで、Stephen Cleary の論理呼び出しコンテキスト MyStackNinjectをのIntercept拡張機能と組み合わせて使用​​してみました。

注入する:

Bind<IThing>().To<Thing>()
    .Intercept()
    .With<SimpleContextGenerator>();

SimpleContextGenerator:

public class SimpleContextGenerator : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        using (MyStack.Push(
                 string.Join(".",
                   invocation.Request.Method.DeclaringType.FullName,
                   invocation.Request.Method.Name)))
        {
            invocation.Proceed();
        }
    }
}

ただし、問題は 2 つあります。1)usingエラーが実際にスローされる前に が完了し、2) に到達するまでにコンテキスト全体がクリアされるため、1 も問題ではありませんIErrorHandler。のコードPopをコメントアウトできます。MyStackCurrentContext.IsEmptytrueProvideFaultIErrorHandler

したがって、私の質問も2部構成です。

IErrorHandler1)呼び出しまでコンテキストを維持する方法はありますか?

2)そうでない場合、コンテキストにアクセスできるグローバル規模でエラーをログに記録する別の方法はありますか?

.NET 4.5、Ninject 3.2、および DynamicProxy 3.2 を使用しています。

正直なところ、例外がどこでスローされたかを知っているだけでうれしいです。現在のクラスとメソッドで十分です。フルスタックは必要ありません。

編集:OperationContextを使用してに配置するとIExtension<>、 に到達するまで保持できIErrorHandlerます。ただし、メソッドがいつ終了するかはまだわからないため、どこで例外が発生したかはわかりません。

4

1 に答える 1