67

我有一个 ASP.Net 单文件 Web 服务(一个.ashx包含IHttpHandler实现的文件),它需要能够返回错误作为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是票。哇。

4

3 回答 3

116

Context.Response.TrySkipIisCustomErrors = true

于 2010-12-22T01:10:47.967 回答
12

我过去使用过以下内容,并且能够使用以下 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-21T03:28:07.607 回答
0

您可能希望设置一个 customErrors 页面(可通过 web.config 配置)。您可以在 Session 中(或通过替代机制)跨请求存储您的内容,然后将 asp.net 配置为显示自定义错误页面,该页面反过来显示您的自定义输出。

不过需要注意的是:如果 500 是由于应用程序的基本问题(即 StackOverflowException)而导致的,并且您尝试显示依赖于 asp.net 的页面(即 MyCustomErrors.aspx),您可能最终会遇到一个循环。

有关更多信息,请查看此页面

于 2010-12-21T03:17:08.803 回答