【问题标题】:How can I get the IIS substatus code from an Exception?如何从异常中获取 IIS 子状态代码?
【发布时间】:2010-10-21 16:31:45
【问题描述】:

我正在以如下方式处理带有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 可以检索这些,因为它的返回值是一个整数?

【问题讨论】:

  • +1。我真的很喜欢使用 InnerExceptionfor 循环 想法。你有没有找到一些代码来提取这些 IIS 错误代码?
  • 仅供参考:您的代码忽略了显示对 Server.ClearError(); 的任何调用,如果其中不存在,您应该添加它。

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


【解决方案1】:

你可能做不到。在此处查看倒数第二个回复: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,看看是否在位级别发生了一些事情,您可以从中找出代码和子代码。

不知道有没有用。

【讨论】:

  • 此外,来自该 MSDN 链接:“当您设置 SubStatusCode 属性时,...代码永远不会作为对请求的最终响应的一部分发送。”
【解决方案2】:

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

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

【讨论】:

  • 这将如何帮助我检索 IIS 状态代码,例如 401.5 或 403.4? GetHttpCode 仍然返回一个整数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 2020-01-10
  • 2010-11-21
  • 2018-05-23
  • 1970-01-01
  • 2022-09-26
相关资源
最近更新 更多