捕获IIS级别错误以在ASP.NET中处理

时间:2010-01-01 21:47:22

标签: asp.net iis web-applications iis-7 iis-6

我正在IIS 7上使用C#开发一个ASP.NET站点,但我希望得到一个适用于IIS 6的答案。该网站的一部分是一次最多上传5张图片。我有一个很好的算法来调整上传到我的最佳大小和比例的图像。

所以我唯一的实际尺寸限制是在初始上传期间。我修改了我的web.config,将数据包限制从4MB提高到32MB。在大多数情况下,这会解决我的问题。

我的问题是在极少数情况下用户尝试加载超过我的限制。我可以提高限制,但用户总有可能找到5个更大的文件。如果用户选择较大的文件,我的try / catch块不会处理错误。错误来自IIS。

那么如何在C#代码中捕获错误,我可以在其中修改我的ASP.NET界面以通知用户选择较小的文件而不是看到一个讨厌的错误屏幕?

4 个答案:

答案 0 :(得分:6)

超过请求长度时,您可以访问异常。使用HttpModule,并为Error事件添加处理程序。

异常的类型为:System.Web.HttpUnhandledException(InnerException类型为:System.Web.HttpException)。

要捕获此异常,请将其添加到web.config:

<httpModules>
    <add name="ErrorHttpModule" type="ErrorHttpModule"/>
</httpModules>

将此类添加到App_Code文件夹:

public class ErrorHttpModule : IHttpModule
{
    private HttpApplication _context;

    public ErrorHttpModule() {
    }

    private void ErrorHandler(Object sender, EventArgs e)
    {
        Exception ex = _context.Server.GetLastError();

        //You can also call this to clear the error
        //_context.Server.ClearError();
    }

    #region IHttpModule Members

    public void Init(HttpApplication context)
    {
        _context = context;
        _context.Error += new EventHandler(ErrorHandler);
    }

    public void Dispose()
    {
    }

    #endregion
}

答案 1 :(得分:2)

如果您使用的是传统的asp:FileUpload控件,那么之前无法检查文件的大小。但是,您可以使用Flash或Silverlight方法。我建议的一个选项是Uploadify

答案 2 :(得分:1)

我不确定这是否可行,但至少在IIS 7中,您可能会尝试在配置为运行静态文件的HttpModule中捕获Error事件。从那里,您可以重定向到适当的错误页面。

答案 3 :(得分:1)

您可以在Global(global.asax.cs文件)中捕获这些内容。添加Application_Error处理程序 - 您将获得HttpUnhandledException。它的InnerException将是一个HttpException,消息“超出最大请求长度”。

但是,在页面代码加载或执行之前会处理这些错误,因此您的页面无法捕获异常或知道它发生过。捕获此异常后,您可以在会话中粘贴一条消息以供稍后显示。您也可以从Global调用response.Redirect来显示新页面,或者使用Session中的错误消息重新显示原始页面。