1

我在 web.config 中放置了以下行,以禁止上传大于 2 MB 的文件:

<httpRuntime maxRequestLength="2048" />

当我点击页面(具有 FileUpload 控件)并上传大于 2 MB 的文件时,页面将在 ProcessRequest 期间抛出异常(下面的 Callstack)。我尝试重载 ProcessRequest,并且可以在 catch 块中处理异常。问题是,当然,在 ProcessRequest 期间,我的页面中的控件还没有被实例化。

我的问题是:有没有办法以某种方式处理异常,我可以将消息返回到页面以供用户查看,或者以某种方式允许请求通过(以某种方式删除文件)以便它到达 Page_Load 和正常处理吗?

调用栈:

 at System.Web.UI.Page.HandleError(Exception e)
 at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
 at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
 at System.Web.UI.Page.ProcessRequest()
 at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
 at System.Web.UI.Page.ProcessRequest(HttpContext context)
 at MyWebsite2.DocDashboard.ProcessRequest(HttpContext req) in MyFile.aspx.cs:line 28
4

1 回答 1

1

我终于能够解决这个问题。我在网上找不到任何关于它的信息,所以我分享我的解决方案。就个人而言,我不太喜欢该解决方案,但这是我发现的唯一可行的方法。为避免崩溃,请覆盖虚函数 ProcessRequest,如果文件超过大小限制,则从流中使用文件。然后调用基础,它会很好地处理页面,文件被删除。这是代码:

     public virtual void ProcessRequest(HttpContext context)
    {
        int BUFFER_SIZE = 3 * 1024 * 1024;
        int FILE_SIZE_LIMIT = 2 * 1024 * 1024;
        if (context.Request.Files.Count > 0 &&
                    context.Request.Files[0].ContentLength > FILE_SIZE_LIMIT)
        {
            HttpPostedFile postedFile = context.Request.Files[0];
            Stream workStream = postedFile.InputStream;
            int fileLength = postedFile.ContentLength;
            Byte[] fileBuffer = new Byte[BUFFER_SIZE];
            while (fileLength > 0)
            {
                int bytesToRead = Math.Min(BUFFER_SIZE, fileLength);
                workStream.Read(fileBuffer, 0, bytesToRead);
                fileLength -= bytesToRead;
            }

            workStream.Close();
        }


        base.ProcessRequest(context);
    }
于 2012-08-16T05:10:03.783 回答