web-dev-qa-db-ja.com

ASP.Netでステータスコード500を送信し、それでも応答に書き込む方法は?

ASP.Net単一ファイルWebサービス(.ashxファイルにIHttpHandler実装が含まれます)-500 Internal Server Errorステータスコードで応答としてエラーを返すことができる必要があります。これは、PHPで行う比較的簡単なことです。

header("HTTP/1.1 500 Internal Server Error");
header("Content-Type: text/plain");
echo "Unable to connect to database on $dbHost";

ASP.Net(C#)に相当するものは次のとおりです。

Context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
Context.Response.ContentType = "text/plain";
Context.Response.Write("Unable to connect to database on " + dbHost);

もちろん、これは期待どおりに機能しません。代わりに、IIS 500ステータスコードをインターセプトし、Responseオブジェクトに書き込んだものをすべて破棄し、アプリの方法に応じてデバッグ情報またはカスタムエラーページを送信します。設定されています。

私の質問-このIIS動作を抑制し、IHttpHandler実装からエラー情報を直接送信するにはどうすればよいですか?

このアプリはPHPからの移植です。クライアント側はすでに記述されているため、基本的にこの仕様にこだわっています。残念なことに、ステータスコード200のエラーを送信することは、型には合いません。

理想的には、「このファイルを編集せずに配布したいSDKの一部であるため、動作をプログラムで制御する必要があります」および「変更this IIS setting "補足説明。

ありがとう!

編集:ソート済み。 Context.Response.TrySkipIisCustomErrors = trueはチケットでした。ワオ。

64
Neil E. Pearson

Context.Response.TrySkipIisCustomErrors = true

108
Neil E. Pearson

過去に以下を使用し、Page_Loadメソッドで以下に示すコードを使用して、カスタムメッセージで503エラーをスローすることができました。サーバーが稼働中かどうかを知るために、ロードバランサーのpingページとしてロードバランサーの背後にあるこのページを使用します。

お役に立てれば。

        protected void Page_Load(object sender, System.EventArgs e)
    {
        if (Common.CheckDatabaseConnection())
        {
            this.LiteralMachineName.Text = Environment.MachineName; 
        }
        else
        {
            Response.ClearHeaders();
            Response.ClearContent(); 
            Response.Status = "503 ServiceUnavailable";
            Response.StatusCode = 503;
            Response.StatusDescription= "An error has occurred";
            Response.Flush();
            throw new HttpException(503,string.Format("An internal error occurred in the Application on {0}",Environment.MachineName));  
        }
    }
10
Paige Cook

CustomErrorsページを設定したい場合があります(web.configで構成可能)。 Sessionのリクエスト全体(または代替メカニズム経由)にコンテンツを保存し、カスタムエラーページを表示するようにasp.netを構成して、カスタム出力を表示することができます。

ただし、注意事項:アプリケーションの根本的な問題(StackOverflowException)が原因で500が発生し、asp.netに依存するページ(MyCustomErrors.aspx)を表示しようとすると、最終的にはループ。

詳細については、 このページ をご覧ください。

0
Bobby D