web-dev-qa-db-ja.com

ASP.NET System.Web.HttpResponse.End()が呼び出されると、現在のスレッドは中止されますか?

system.Web.HttpResponse.End()が呼び出されたときにSystem.Thread.Abortが発生しますが、これは例外である(または発生する)と思いますか?いくつかのログがあり、これはログファイルにリストされています...

最初のチャンス

exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
12/14/2008 01:09:31::
Error in Path :/authenticate
Raw Url :/authenticate
Message :Thread was being aborted.
Source :mscorlib
Stack Trace :   at System.Threading.Thread.AbortInternal()
   at System.Threading.Thread.Abort(Object stateInfo)
   at System.Web.HttpResponse.End()
   at DotNetOpenId.Response.Send()
   at DotNetOpenId.RelyingParty.AuthenticationRequest.RedirectToProvider()
   at MyProject.Services.Authentication.OpenIdAuthenticationService.GetOpenIdPersonaDetails(Uri serviceUri) in C:\Users\Pure Krome\Documents\Visual Studio 2008\Projects\MyProject\Projects\Services\Authentication\OpenIdAuthenticationService.cs:line 108
   at MyProject.Mvc.Controllers.AuthenticationController.Authenticate() in C:\Users\Pure Krome\Documents\Visual Studio 2008\Projects\MyProject\Projects\MVC Application\Controllers\AuthenticationController.cs:line 69
TargetSite :Void AbortInternal()
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in Ackbar.Mvc.DLL
An exception of type 'System.Threading.ThreadAbortException' occurred in Ackbar.Mvc.DLL but was not handled in user code

これは正常な動作であり、突然の突然の中止の代わりに(どのように見えるか)正常に中止することは可能ですか?

更新

これまでのところ、それは 設計による であるというのが一般的な国勢調査です。ですから、この質問に答えて、コードを微調整して、スレッドが途中で終了しているように感じないようにすることができるかどうか疑問に思っていますそして優雅に終了します...可能ですか?コード例?

18
Pure.Krome

はい、これは確かに仕様によるものです。 Microsoftには 文書化された それさえあります。他にどのようにしてプログラムの残りの実行を停止しますか?

6
Vilx-

「優雅な」中絶のようなものはありません。ただし、応答を終了してフレームワークに接続を閉じる代わりに、単に応答をFlush()することもできます。この場合、応答をクライアントに送信する必要があると想定しています。つまり、一般的なケースです。

[〜#〜] msdn [〜#〜] によると、Response.End()を呼び出すと、応答が途中で終了したときにThreadAbortExceptionがスローされます。実際には、例外を発生させたい場合にのみResponse.End()を呼び出す必要があります。

11
tvanfosson

現在の実行を停止するためにスタックを再帰的に実行する例外について、本質的に不愉快なことは何もありません。確かに、例外をスローして、例外のより低い場所でそれをキャッチするだけです。

私はあなたのログからそれをフィルタリングすることを検討します。 ASP.Netヘルスモニタリングを使用している場合は、各例外を特定のプロバイダー(イベントログ、メールなど)に構成/マップして、threadabort例外の通知を受け取るかどうかを制御できます。カスタムロギングの場合は、それをチェックするためにifを追加するだけです。

ThreadAbortExceptionを食べることはできないため、ロギングコードがcatch(Exception e) { // log exception and then do not throw again }のようなことをしている場合でも、catchブロックが終了すると、FrameworkによってThreadAbortExceptionが再び発生することに注意してください。

3
Peter Oehlert

Response.End()メソッドはApplication.End()を使用し、アプリケーションを停止するため、使用しないでください。さらに、ページのライフサイクルに違反するHTTP要求または応答を使用します。 HttpContext.Current.Response.Close()またはHttpContext.Current.ApplicationInstance.CompleteRequest();を使用します。

0
shhhhh

上記のすべての変更を使用しましたが、それでもWebアプリケーションで同じ問題が発生していました。

次に、ホスティングプロバイダーに連絡して、HTTP経由で転送するファイルをブロックしているソフトウェアまたはアンチウイルスがあるかどうかを確認するように依頼しました。またはISP /ネットワークがファイルの転送を許可していません。

彼らはサーバー設定をチェックし、私のサーバーの「データセンター共有ファイアウォール」をバイパスしました。そして今、私たちのアプリケーションはファイルのダウンロードを開始しました。

この答えが誰かを助けることを願っています。これは私のために働いたものです

0
Sushil Jadhav