如何在ASP.Net中发送状态码500并仍写入响应?

我有一个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对象的任何东西都刷新,并根据应用程序的configuration发送debugging信息或自定义错误页面。

我的问题 – 我怎么能抑制这种IIS行为,并直接从我的IHttpHandler实施发送错误信息?

这个应用程序是从PHP端口; 客户端已经写了,所以我基本上坚持这个规范。 用200状态码发送错误很遗憾,不适合模具。

理想情况下,我需要以编程方式控制行为,因为这是我们想要分发的SDK的一部分,而不需要任何“ 编辑此文件 ”和“ 更改此IIS设置 ”的补充说明。

谢谢!

编辑 :sorting。 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.configconfiguration)。 你可以在会话中通过请求存储你的内容(或者通过一个替代的机制),然后configurationasp.net来显示自定义错误页面,然后显示你的自定义输出。

但是,谨慎的说法是:如果由于应用程序的基本问题(即StackOverflowException)导致500,并且您尝试显示依赖于asp.net的页面(即MyCustomErrors.aspx),则最终可能会导致一个循环。

欲了解更多信息,请查看此页面 。