如何从异常中获取IIS子状态代码?

时间:2009-04-24 18:55:51

标签: c# asp.net iis-6 http-status-codes

我正在使用HttpModule处理例外情况,例如:

int errorCode = 500;
HttpApplication httpApp = (HttpApplication)sender;

try
{
    if (httpApp.Server != null)
    {
        Exception ex;

        for (ex = httpApp.Server.GetLastError(); ex != null; ex = ex.InnerException)
        {
            try
            {
                HttpException httpEx = ex as HttpException;
                if (httpEx != null)
                    errorCode = httpEx.GetHttpCode();

                // ... retrieve appropriate content based on errorCode
            }
            catch { }
    }
}

对于HTTP status codes(例如:302,404,503等),一切都很好。但是,对于IIS status codes(例如:401.5,403.4等),可以GetHttpCode检索这些,因为它的返回值是整数吗?

2 个答案:

答案 0 :(得分:2)

你可能无法做到。请在此处查看倒数第二个回复:http://www.velocityreviews.com/forums/t73739-sending-status-as-4011.html。 HTTP RFC没有定义子代码(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)。看起来它可能只是MS的一部分 - 请参阅第一个链接中的最后一个响应,然后指向此处:http://msdn.microsoft.com/en-us/library/system.web.httpresponse.substatuscode.aspx。虽然这是如何设置子状态代码而不是检索它,但有趣的是,它仅支持“使用IIS 7.0中的集成管道模式,至少支持.NET Framework 3.0版。”

我能想到的唯一另一件事就是在HttpException的ErrorCode属性中查看HRESULT,看看是否在位级上发生了一些事情,你可以从中找出代码和子代码。 / p>

不知道这是否有帮助。

答案 1 :(得分:-2)

您不需要内部异常。你想要:

HttpException httpEx = httpApp.Server.GetLastError() as HttpException;
if (httpEx != null)
    errorcode = httpEx == null ? 0 : httpex.GetHttpCode();