14

ユーザーがファイルをアップロードできるようにするaspxページがあり、ファイルの最大アップロードサイズを10MBに制限したいと思います。IIS7、.NET3.5。web.configファイルで次の設定を行っています。

<location path="foo.aspx">
    <system.web>
        <!-- maxRequestLength: kbytes, executionTimeout:seconds -->
        <httpRuntime maxRequestLength="10240" executionTimeout="120" />
        <authorization>
            <allow roles="customRole"/>
            <!-- Deny everyone else -->
            <deny users="*"/>
        </authorization>
    </system.web>
    <system.webServer>
        <security>
            <requestFiltering>
                <!-- maxAllowedContentLength: bytes -->
                <requestLimits maxAllowedContentLength="10240000"/>
            </requestFiltering>
        </security>
        <handlers accessPolicy="Read, Script">
            <add name="foo" path="foo.aspx" verb="POST"
               type="System.Web.UI.PageHandlerFactory"
               preCondition="integratedMode" />
        </handlers>       
    </system.webServer>
</location>

を実装するカスタムエラー処理モジュールがありますIHttpModule。私はmaxRequestLength、超えたときHttpApplication.Errorに実際に発生することを発見しました。ただし、で遊んでいるとmaxAllowedContentLengthHttpApplication.Errorイベントが発生せず、ユーザーは404.13ページにリダイレクトされます。最初のチャンスの例外をオンにしてVisualStudioに接続しましたが、何もスローされていません。

私の最初の考えは、以前のイベントでヘッダーコンテンツの長さを確認することです。これを行う場所に関する推奨事項/ベストプラクティスはありますか?PostLogRequest?EndRequest?

4

2 に答える 2

3

最も簡単な方法は、ページ自体の OnError メソッドで処理することです。

WebEventCode プロパティは .NET 4.0 で NEW として文書化されているため、これは .NET 4.0 でのみ機能すると思います。

protected override void OnError(EventArgs e)
{
    Exception err = Server.GetLastError();
    if (err is HttpException)
    {
        if ((err as HttpException).WebEventCode == 3004)
        {
            Context.Items["error"] = "File exceeded maximum allowed length.";
            Server.Transfer( Context.Request.Url.LocalPath );
            return;
        }
    }
    base.OnError(e);
}

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    if (!IsPostBack)
    {
        string error = Context.Items["error"] as string;
        if (!string.IsNullOrEmpty( error ))
            showErrorMessage( error );
    }
}

私がしたことは:

  • Server.GetLastError で最後のエラーを取得します
  • 「最大リクエスト長を超えました」であることを確認してください。エラー (WebEventCode == 3004)。
  • Context.Items コレクションに値を追加して、リクエストにエラーのフラグを立てました
  • Server.Transfer(Context.Request.Url.LocalPath) を使用して、リクエストをページ自体に転送します。
  • ページの OnLoad メソッドはエラー フラグをチェックし、存在する場合はメッセージを表示します。

これにより、要求されたページでエラーが完全に処理され、ページがエラーを報告できるようになります。

また、ブラウザーは最終的に適切な応答を受け取りますが、サーバーの応答を処理して表示する前に、ブラウザーが要求全体をアップロードするのに時間がかかる場合があることにも注意してください。この動作は、おそらく HTTP プロトコルのサーバー/ブラウザーの対話の一部として定義されているため、おそらくそれについてできることはあまりありません。

于 2011-04-15T05:48:28.220 に答える