5

Web サーバーで実行されている非同期タスクにログインする Elmah が必要です。しかし、エラーをログに記録しようとすると、HttpContext のために失敗します。

        var httpContext = HttpContext.Current;

        Task.Factory.StartNew(() =>
        {
            HttpContext.Current = httpContext;

            try
            {
                //Execute some code
            }
            catch (Exception ex)
            {
                //Generate some error for the user and log the error in Elmah
                try
                {
                    ErrorLog.GetDefault(HttpContext.Current).Log(new Error(ex));
                }
                catch(Exception ex)
                {
                }
            }
        });

タスクの進行状況を取得するために、いくつかのポーリング メカニズムを実装しました。現在、Elmah にはエラーが記録されていないため、解決が困難です。

また、パラメータとしてコンテキストを提供しても機能しません。

うまくいきません。期待される値が期待される範囲内にないことを示す ArgumentException が発生します。次のスタックトレースを使用:

System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32 errorCode、IntPtr errorInfo) で System.Web.Hosting.IIS7WorkerRequest.GetServerVariableInternal (文字列名) で System.Web.HttpRequest.AddServerVariableToCollection (文字列名) で System.Web.HttpRequest で。 Elmah.ErrorLog.InferApplicationName(HttpContext コンテキスト) の System.Web.HttpServerVarsCollection.Populate() の System.Web.HttpServerVarsCollection.Populate() で FillInServerVariablesCollection()。 D の Bi.Utilities.Log.ElmahErrorLog.TryLogError(例外例外) で Elmah.ErrorLog.GetDefault(HttpContext コンテキスト) で Elmah.ServiceCenter.GetService(オブジェクト コンテキスト、タイプ serviceType) で GetService(タイプ serviceType):\Users\A500535\Documents\Projecten\Biobank\Bis\src\Utilities\Log\ElmahErrorLog.cs:13行目

4

2 に答える 2

5

以下は、仕事を成し遂げる可能性のある醜いハックの1つです。基本的に、それはError偽物Exceptionプロトタイプ)上にオブジェクトを作成し、リクエストがまだ実行されている間にコンテキストをキャプチャできるようにします。後で、要求の結果として開始されたタスクが失敗するErrorと、発生した実際の例外から別のオブジェクトが作成され、興味深いコンテキストビットが以前のプロトタイプから選択的にコピーされます。Error残念ながら、例外が発生するかどうかに関係なく、プロトタイプを作成する必要があります。

// Create an error that will capture the context
// and serve as a prototype in case a real exception
// needs logging

var prototype = new Error(new Exception(), context);

Task.Factory.StartNew(() =>
{
    try
    {
        // Execute some code
    }
    catch (Exception ex)
    {
        // Generate some error for the user and log the error in ELMAH
        try
        {
            // Create a new error without contextual information
            // but then copy over the interesting bits from the
            // prototype capture at time of request.

            var error = new Error(ex)
            {
                HostName = prototype.HostName,
                User = prototype.User,
            };
            error.ServerVariables.Add(prototype.ServerVariables);
            error.QueryString.Add(prototype.QueryString);
            error.Cookies.Add(prototype.Cookies);
            error.Form.Add(prototype.Form);
            ErrorLog.GetDefault(null).Log(error);
        }
        catch(Exception)
        {
        }
    }
});
于 2012-08-13T13:39:36.907 に答える
2

新しいスレッドを開始すると、HttpContext 構造が取得されません。Elmah ロギングには HttpContext データが必要なため、失敗します。

次の QA を参照してください: Elmah Does not email in a fire and forget シナリオ

私にとって、これは Task.Run で呼び出された非同期タスクで機能しました。

Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new NotSupportedException("elmah logging test")));
于 2015-07-08T08:54:06.327 に答える