Asp.net 捕获上传到大文件的数据

Asp.net 捕获上传到大文件的数据,asp.net,error-handling,file-upload,Asp.net,Error Handling,File Upload,Asp.Net对文件上载有一个上限。我试图在服务器端了解这种情况。根据我找到的文档,应该可以覆盖Global.asax中的Application_Error,但它对我不起作用。第二个选项是覆盖接收页面的OnError,但这也不起作用 任何人都可以展示一些关于如何在服务器端捕获此错误的工作代码吗?而不是捕获错误您不能对照web.config文件中指定的最大大小检查文件大小吗?您可以使用以下方法获得最大尺寸: System.Configuration.Configuration config = W

Asp.Net对文件上载有一个上限。我试图在服务器端了解这种情况。根据我找到的文档,应该可以覆盖Global.asax中的Application_Error,但它对我不起作用。第二个选项是覆盖接收页面的OnError,但这也不起作用


任何人都可以展示一些关于如何在服务器端捕获此错误的工作代码吗?

而不是捕获错误您不能对照web.config文件中指定的最大大小检查文件大小吗?您可以使用以下方法获得最大尺寸:

System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
HttpRuntimeSection section = config.GetSection("system.web/httpRuntime") as HttpRuntimeSection;
double maxFileSize = section.MaxRequestLength;
“有人能在屏幕上显示一些工作代码吗 如何在服务器上捕获此错误 一边?”

没有。无法使用代码捕获此错误,因为它发生在任何代码启动之前


据我所知,您甚至无法为此错误指定其他错误页面,web服务器只是在请求太大时拒绝接受请求。

是一个jquery和flash上传程序,允许您指定要下载的文件的最大大小。通过这种方式,您可以首先阻止用户下载文件,并且不必担心在下载后会被捕获。

将以下内容放入Golobal.asax.cs中:

void Application_Error(Object sender, EventArgs e)
        {
            HttpException ex = Server.GetLastError() as HttpException;
            if (ex != null)
            {
                if ((ex.GetHttpCode() == 500 || ex.GetHttpCode() == 400) && ex.ErrorCode == -2147467259)
                {
                    Server.ClearError();
                    Response.Redirect("~/MaximumFileError.aspx", false);
                }
            }
        }

这对我很有效,但我不确定它是否适用于所有情况。

首先,您应该了解关于maxRequestLength的一些事情。使用服务器端验证方法无法预测文件大小。将值设置为高会增加DoS攻击的风险。 我在web.config中将maxRequestLength设置为8MB:

 <httpRuntime maxRequestLength="8192" executionTimeout="3600" />
如果我在Global.asax中识别出这个异常,我会将用户重定向到带有警报的页面(在GET中给出)

在我的ASPX代码隐藏页面中:

首先,我通过以下树行从web.config检索MaxRequestLength的值,并将其减半:

static System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
static HttpRuntimeSection section = config.GetSection("system.web/httpRuntime") as HttpRuntimeSection;
int maxFileSize = (section.MaxRequestLength/2)*1024; 
然后,在与“插入”按钮相关的操作中,我继续执行以下操作:

  protected void InsertButton_Click(object sender, EventArgs e)
        {
            if (((FileUpload)FormView1.FindControl("FileUpload1")).HasFile) // WHEN USER WANT TO UPLOAD FORM WITH FILE (its, optional)
            {
                HttpPostedFile file = (HttpPostedFile)(((FileUpload)FormView1.FindControl("FileUpload1")).PostedFile);
                int iFileSize = file.ContentLength;
                if ((file != null) && (file.ContentLength > 0))
                {
                   if (iFileSize > maxFileSize) // checking image SIZE!
                    { 
                        MessageForUser.Text = "<h1 class=error>Bad File! File is to big!</h1>";
                    }
                    else
                    {
                        byte[] plik = ((FileUpload)FormView1.FindControl("FileUpload1")).FileBytes;
              // HERE COMES CODE FOR INSERT OF FORM WITH FILE
                        MessageForUser.Text = "<h1>Insert was sucessfull</h2>";
                    }
                }
            }
            else
            {
              // HERE COMES CODE FOR INSERT OF FORM WITHOUT FILE
                MessageForUser.Text = "<h1>Insert was sucessfull</h2>";
        }
    }
protectedvoid InsertButton\u单击(对象发送方,事件参数e)
{
if(((FileUpload)FormView1.FindControl(“FileUpload1”)).HasFile)//当用户希望上载带有文件的表单时(its,可选)
{
HttpPostedFile=(HttpPostedFile)((FileUpload)FormView1.FindControl(“FileUpload1”).PostedFile);
int-iFileSize=file.ContentLength;
如果((file!=null)&&(file.ContentLength>0))
{
if(iFileSize>maxFileSize)//检查图像大小!
{ 
MessageForUser.Text=“坏文件!文件太大了!”;
}
其他的
{
字节[]plik=((FileUpload)FormView1.FindControl(“FileUpload1”)).FileBytes;
//下面是插入表单和文件的代码
MessageForUser.Text=“插入成功”;
}
}
}
其他的
{
//下面是插入无文件表单的代码
MessageForUser.Text=“插入成功”;
}
}
在页面加载中,我还定义了如何检索GET from Global.asax给出的通信,以通知用户发生了什么

 if (Request.QueryString["alert"]!=null)
            {
                string temp =  Request.QueryString["alert"].Replace('-',' ');
                MessageForUser.Visible = true;
                MessageForUser.Text = "<h1 class=error>ERROR: " + temp + "</h1>";
            }   
if(Request.QueryString[“alert”!=null)
{
string temp=Request.QueryString[“alert”].Replace('-','');
MessageForUser.Visible=true;
MessageForUser.Text=“错误:+temp+”;
}   
这种解决方案当然有其缺点:

  • 尽管如此,我们仍然可能会受到8MB文件的DoS攻击,这是我们在服务器级别首先认识到的,但已经很晚了
  • 从Global.asax重定向时,用户表单的状态将丢失,但这需要一些代码才能克服
  • 由于服务器端的检查,并且由于许多用户的负载,应用程序可能会变得缓慢,因此用户过期率相当低
  • 服务器上临时出现的文件甚至大于8MB,但这些文件在executionTimeout中管理
  • 可能的替代方案:

  • 使用一些flash技术在客户端检查文件大小
  • 使用一些流技术,在小数据包中传输比特,当达到给定阈值时,抛出自己的异常并处理它。 恰当的阅读:

  • 该代码将永远无法访问,因为IIS会更早地截获上载。如果我在web.config中增加最大上载大小,它将正常工作。因此,上载必须被asp.net运行时的某些部分拦截。然后它应该有可能以某种方式抓住这一点。你同意吗?@Achim:如果你将限制设置得如此之高,以至于实际上已经消除了限制,你可以在代码中进行检查,但是你的服务器很容易受到DoS攻击。有人可能只是开始几次大的上传,这将耗尽服务器中的所有RAM。不,这取决于代码在何时何地执行。我要说的是:如果限制是在asp.ne运行时配置的,那么它也会在asp.net运行时处理。因此,请求至少到达asp.net,在此之前不会被IIS阻止。然后,应该可以在asp.net中以某种方式捕获它。根据我提到的地方的文档,这应该是可能的,但事实并非如此@阿希姆:读了一些关于它的文章,我发现你实际上可以在服务器端捕捉到错误,但这是非常无用的,因为服务器已经切断了连接以停止上传。你唯一能做的就是在服务器上记录错误,请求已经被中止,因此你根本无法向浏览器发送任何信息。
     if (Request.QueryString["alert"]!=null)
                {
                    string temp =  Request.QueryString["alert"].Replace('-',' ');
                    MessageForUser.Visible = true;
                    MessageForUser.Text = "<h1 class=error>ERROR: " + temp + "</h1>";
                }