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
はチケットでした。ワオ。
Context.Response.TrySkipIisCustomErrors = true
過去に以下を使用し、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));
}
}
CustomErrorsページを設定したい場合があります(web.configで構成可能)。 Sessionのリクエスト全体(または代替メカニズム経由)にコンテンツを保存し、カスタムエラーページを表示するようにasp.netを構成して、カスタム出力を表示することができます。
ただし、注意事項:アプリケーションの根本的な問題(StackOverflowException)が原因で500が発生し、asp.netに依存するページ(MyCustomErrors.aspx)を表示しようとすると、最終的にはループ。
詳細については、 このページ をご覧ください。