我有一个ASP.Net单文件web服务(一个包含IHttpHandler
实现的.ashx
文件),它需要能够以500内部服务器错误状态码作为响应返回错误。在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的一部分,而不需要任何“编辑此文件”和“更改此IIS设置”的补充指令。
谢谢!
编辑:已排序。Context.Response.TrySkipIisCustomErrors = true
就是门票。哇。
发布于 2010-12-22 09:10:48
Context.Response.TrySkipIisCustomErrors = true
发布于 2010-12-21 11:28:08
我在过去使用过以下代码,并且能够使用下面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));
}
}
发布于 2010-12-21 11:17:09
您可能希望设置一个customErrors页面(可通过web.config配置)。您可以在会话中跨请求存储您的内容(或通过另一种机制),然后将asp.net配置为显示自定义错误页面,该页面反过来显示您的自定义输出。
但是需要注意的是:如果500是由应用程序的基本问题(即StackOverflowException)引起的,而您试图显示一个依赖于asp.net (即MyCustomErrors.aspx)的页面,那么您可能会陷入循环。
有关更多信息,请查看this page。
https://stackoverflow.com/questions/4495961
复制相似问题