10

この質問に重複フラグを設定しないでください。 「ThreadAbortException が発生する理由」ではなく、「ThreadAbortException 後に w3wp.exe プロセスが終了する理由」に関するものです。

次のコード サンプルを含む単純な Web アプリケーションがあるとします。

protected void Page_Load(object sender, EventArgs e)
{
    Response.Redirect("http://google.com");
}

実際には、次のようなことを意味します ( Is Response.End() は有害と見なされますか?を参照):

protected void Page_Load(object sender, EventArgs e)
{
    ...response write some data...
    System.Threading.Thread.CurrentThread.Abort();
}

私のマシン (Windows 10 Pro + IIS) では、このコードにより IIS プール プロセスがエラー コード 0x0 (リダイレクトは実行されません) で終了します。他のマシン (Windows 10 ではない) では、このコードは ThreadAborted 例外のみを生成しますが、プロセスは引き続き動作します (リダイレクトが実行されます)。

誰かがこのサンプルをチェックして、何が起こっているのか説明できますか?

更新 ここに、この問題に関連するいくつかの Windows イベント ログがあります。

ログ #1

未処理の例外が発生し、プロセスが終了しました。

アプリケーション ID: /LM/W3SVC/1/ROOT/AS

プロセスID: 6700

例外: System.Threading.ThreadAbortException

メッセージ: スレッドは中止されました。

StackTrace: System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr、HttpContext コンテキスト) で System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper (IntPtr rootedObjectsPointer、IntPtr nativeRequestContext、IntPtr moduleData、Int32 フラグ) で System.Web.Hosting.PipelineRuntime.ProcessRequestNotification (IntPtr rootedObjectsPointer、IntPtr nativeRequestContext、IntPtr moduleData、Int32 フラグ)

ログ #2

Faulting application name: w3wp.exe, version: 10.0.10240.16384, time stamp: 0x559f3dad
Faulting module name: KERNELBASE.dll, version: 10.0.10240.16384, time stamp: 0x559f3b2a
Exception code: 0xe0434352
Fault offset: 0x000b3e28
Faulting process id: 0x1a2c
Faulting application start time: 0x01d0e4b1b3ed01cb
Faulting application path: C:\WINDOWS\SysWOW64\inetsrv\w3wp.exe
Faulting module path: C:\WINDOWS\SYSTEM32\KERNELBASE.dll
Report Id: 23b5298d-3b36-49c7-a294-de9c864b703f
Faulting package full name: 
Faulting package-relative application ID: 
4

4 に答える 4

5

.NET 4.6 がインストールされた Server 2008r2 で問題を再現できました。

他の皆さんが遭遇しているのと同じ問題だったと思います。ThreadAbortExceptions がイベント ログのアプリケーション プールを強制終了します (私の場合、未処理の例外が原因で問題が発生しますが、それは単にグローバル例外ハンドラーがそれをキャッチし、Response.End または Redirect で終了する可能性があります)。ダンプ スタック トレースは、Ian の回答のも​​のとも一致します。

この問題に対して開かれた MS Connect チケットがあり、最近の KB ホットフィックスが問題を解決してくれました。

記事を接続: https://connect.microsoft.com/VisualStudio/feedback/details/1605438/disabling-ryujit-breaks-asp-net

KB ホットフィックス: https://support.microsoft.com/en-us/kb/3098786

于 2015-11-24T21:02:22.290 に答える
4

これまでのところ、唯一の解決策があります。

    static class WebExtensions
    {
        public static void EndSafe(this HttpResponse response)
        {
            response.Flush();
            response.SuppressContent = true;
            HttpContext.Current.ApplicationInstance.CompleteRequest();
        }

        public static void RedirectSafe(this HttpResponse response, string url)
        {
            response.Redirect(url, false);
            HttpContext.Current.ApplicationInstance.CompleteRequest();
        }
    }

ただし、これにより、その後にコードが実行されないようにする必要があります。

...some code
response.RedirectSafe(url);
return; //<-- important
...some more code

「return」だけでは不十分な場合 (再帰呼び出しなど) や、「return」の使用を避ける必要がある場合 (try-finally 構造) があることに注意してください。

于 2015-09-08T14:09:36.410 に答える
2

Windows Update をインストールするために再起動した後、Windows 8.1 でもまったく同じ問題に遭遇しました。

問題は、この問題useLegacyJitにより、 DWORD を追加して 1 に設定することにより、レジストリで RyuJIT を手動で無効にしたことでした(方法 #3を参照)。しかし、アップデートの 1 つがUseRyuJIT同じ場所にキーを作成し、それを 1 に設定したため、ASP.NET がひどく混乱したようです。

useLegacyJit解決策は、0に設定してiisreset. その後、世の中は順調です。

ダンプをデバッグすると、 WinDbg!clrstackに次のフレームが表示されました。w3wp.exeおそらくこれは、解決策をグーグルで調べている同じエラーを持つ他の人を助けるでしょう:

000000ef9892be98 00007ffa0e2d1fea [HelperMethodFrame: 000000ef9892be98] 
000000ef9892bf80 00007ff99d776588 System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
000000ef9892df90 00007ff9fc172345 [FaultingExceptionFrame: 000000ef9892df90] 
000000ef9892e490 00007ff99d7796c0 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext)
000000ef9892e520 00007ff99d777377 System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
000000ef9892e700 00007ff99d77655a System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
000000ef9892e740 00007ff99d775c11 DomainNeutralILStubClass.IL_STUB_ReversePInvoke(Int64, Int64, Int64, Int32)
000000ef9892ef58 00007ff9fc100b4e [InlinedCallFrame: 000000ef9892ef58] System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr, System.Web.RequestNotificationStatus ByRef)
000000ef9892ef58 00007ff99d78cc1b [InlinedCallFrame: 000000ef9892ef58] System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr, System.Web.RequestNotificationStatus ByRef)
000000ef9892ef30 00007ff99d78cc1b DomainNeutralILStubClass.IL_STUB_PInvoke
000000ef9892f000 00007ff99d77756c System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
000000ef9892f1e0 00007ff99d77655a System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
000000ef9892f220 00007ff99d775c11 DomainNeutralILStubClass.IL_STUB_ReversePInvoke(Int64, Int64, Int64, Int32)
000000ef9892f418 00007ff9fc100da3 [ContextTransitionFrame: 000000ef9892f418]
于 2015-09-18T14:52:49.283 に答える