2010-12-21 5 views
63

500内部サーバーエラーステータスコードで応答としてエラーを返すことができる必要があるASP.Net単一ファイルWebサービス(IHttpHandler実装を含む.ashxファイル)があります。これは、PHPで行うには比較的簡単なものである:ASP.Netでステータスコード500を送信しても応答に書き込む方法はありますか?

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のエラーを送信すると、金型に適合しません。

これは我々がどのなし「編集このファイル」と補足説明「これは設定IIS 変更」を配布するSDKの一部であるため、理想的には、私は、プログラムによって動作を制御する必要があります。

ありがとうございます!

をソートしました。 がチケットだった。ワオ。

+2

可能であれば、私は、このような生産現場でのデータベースの場所などの内部情報を与えないだろう - ハッカーはこのようなものを得ることが大好き、彼らの攻撃がはるかに容易になります。 – devstuff

+1

良い点ですが、これはセキュリティで保護されたWebサービスであり、Webサイトではありません。以前に成功したHTTP認証なしではデータベース接続も試行されません:) –

答えて

101

+5

IIS7でサポートされています - http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors%28v=VS.90%29.aspx – AUSteve

+0

フレームワークのオブジェクト参照を介したコーミングが失われた芸術になっていることは、このような答えです。もし私が2倍upvoteすることができたら私はします。 –

0

customErrorsページを設定することもできます(web.configで設定可能)。セッション内の要求(または代替のメカニズムを介して)にコンテンツを保存し、カスタム出力ページを表示するようにasp.netを設定して、カスタム出力を表示することができます。

ただし、アプリケーションの基本的な問題(たとえばStackOverflowException)によって500が発生し、asp.net(つまりMyCustomErrors.aspx)に依存するページを表示しようとすると、ループで終わる可能性があります。

詳細については、this pageを参照してください。

+0

Thanks Bobby。私はcustomErrorsディレクティブに精通していますが、残念なことにweb.configファイルの編集に依存しています。ユーザーはこれを実行できません。考えられる解決策の1つは、web.configファイルをプログラムで変更することですが、明らかに理想的ではありません。 –

8

私は過去に以下を使用しており、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)); 
     } 
    } 
+0

こんにちは。これは、.ashxファイルまたは通常の.aspxファイルからですか?私はclear/flushメソッドを追加しようとしましたが、違いはありませんでした。私はまた、新しいHttpExceptionを投げてみました。そして、ちょっと余計なHTMLナンセンスを手に入れました。ニースを試してみてください。 –

+0

Neil。これは通常の.aspxページからのものです。申し訳ありませんが、私はあなたが.ashxファイルで作業していたことを忘れていました。 –

+0

私は完璧に働いた、ありがとう。 –

関連する問題