1

2 MBを超えるファイルのアップロードを禁止するために、web.configに次の行を配置しました。

<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 に答える