2

ファイルのアップロード要求をインターセプトする MVC アプリケーション用の HttpModule を作成しようとしています。

目標は、リクエストのコンテンツの長さを確認するために、送信前にリクエストをキャッチすることです。

コンテンツの長さが許可されている長さよりも大きい場合は、そのリクエストをキャンセルし、応答として空の文字列を送信する必要があります。

ユーザーがクリックしてドキュメントをアップロードすると、UploadSignedDocument アクションに対して ajax 呼び出しが行われます。

[NoCache, HttpPost, ValidateAntiForgeryToken]        
public string UploadSignedDocument(int orderid, HttpPostedFileBase fileUpload)
{
    try
    {
        var fileinfo = new FileInfo(fileUpload.FileName);
        var newFileName = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss_") + fileinfo.Name;
        var docPath = Path.Combine(Server.MapPath("~/Uploads/"), newFileName);
        fileUpload.SaveAs(docPath);
        return newFileName;
    }
    catch
    {
        return "";
    }
}

次の HttpModule によってインターセプトされます。

public class UploadedFileSizeScreeningModule : IHttpModule
{    
    public void Init(HttpApplication application)
    {
        application.EndRequest += ValidateUploadRequest;
    }

    public void Dispose()
    {
    }

    private static void ValidateUploadRequest(object source, EventArgs e)
    {
        HttpApplication context = source as HttpApplication;

        if (context.Request.HttpMethod.ToUpperInvariant() != "POST" ||
            !context.Request.Path.Contains("OrderQueue/UploadSignedDocument"))
        {
            return;
        }

        var requestLengthInMB = context.Request.ContentLength / 1024 / 1024;

        if (requestLengthInMB > Settings.Default.MaxFileSizeInMB)
        {
            // TODO: Return new response (empty string)
        }
    }
}

HttpHandler から呼び出し元に空の文字列を返すにはどうすればよいですか?

4

1 に答える 1

3
  1. context.Responseajax 応答を返すには、それ自体を使用する必要があります。そこに空の文字列を書き込むだけです。
  2. に登録する必要がありますHttpApplication.EndRequest。ここで、実際に HTTP 応答を変更 (または置換) することができます。
  3. イベントを使用しないでください:HttpApplication.PreSendRequestHeaders

PreSendRequestHeaders および PreSendRequestContext イベントは、ネイティブ IIS モジュールで使用できますが、 IHttpModuleを実装するマネージ モジュールでは使用しないでください。これらのプロパティを設定すると、非同期リクエストで問題が発生する可能性があります。

ASP.NET ですべきでないことと、代わりにすべきことから。

編集

たぶん、このようなものですか?

public class UploadedFileSizeScreeningModule : IHttpModule
{    
    public void Init(HttpApplication application)
    {
        application.EndRequest += ValidateUploadRequest;
    }

    public void Dispose()
    {}

    private static void ValidateUploadRequest(object source, EventArgs e)
    {
        HttpApplication context = source as HttpApplication;

        if (context.Request.HttpMethod.ToUpperInvariant() != "POST" ||
            !context.Request.Path.Contains("OrderQueue/UploadSignedDocument"))
        {
            return;
        }

        var requestLengthInMB = context.Request.ContentLength / 1024 / 1024;

        if (requestLengthInMB > Settings.Default.MaxFileSizeInMB)
        {
            context.Response.Clear();
            context.Response.Write(string.Empty);
            context.Response.End();            
        }
    }
}
于 2014-09-30T16:47:17.017 に答える