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.Response本身来返回 ajax 响应。只需在其中写入空字符串。
  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 回答