protected void Application_BeginRequest(object sender, EventArgs e)
{
const int maxFileSizeKBytes = 10240; //10 MB
const int maxRequestSizeKBytes = 305200; //~298 MB
if (Request.ContentLength > (maxRequestSizeKBytes * 1024))
{
Response.Redirect(".aspx?requestSize=" + Request.ContentLength.ToString());
}
for (int i = 0; i < Request.Files.Count; i++)
{
if (Request.Files[i].ContentLength > (maxFileSizeKBytes * 1024))
{
Response.Redirect(".aspx?fileSize=" + Request.Files[i].ContentLength.ToString());
}
}
}
此代码位于Global.asax.cs页面中。
我需要重定向到触发此检查的页面。我需要知道ticketId或projectId参数。例如,我在View Project页面/Project/ViewProject.aspx?projectId=1
创建新票证我需要向用户重定向到该页面,并向用户发送有意义的消息,因为我认为重定向到另一个页面以显示错误消息并不是一个好主意。
答案 0 :(得分:1)
为什么不将这些检查放在ViewProject(以及需要检查的任何其他内容)派生自的基页类的Load处理程序中?然后,如果检查失败,您可以只显示错误标签。未经测试的代码:
public class BasePage : Page{
protected virtual Label ErrorLabel { get; set; };
protected override OnLoad(object sender, EventArgs e) {
base.OnLoad(sender, e);
const int maxFileSizeKBytes = 10240; //10 MB
const int maxRequestSizeKBytes = 305200; //~298 MB
if (Request.ContentLength > (maxRequestSizeKBytes * 1024))
{
ErrorLabel.Text = "Request length "+Request.ContentLength+" was too long."
ErrorLabel.Visible = true;
}
for (int i = 0; i < Request.Files.Count; i++)
{
if (Request.Files[i].ContentLength > (maxFileSizeKBytes * 1024))
{
ErrorLabel.Text = "File length "+ Request.Files[i].ContentLength +" was too long."
ErrorLabel.Visible = true;
}
}
}
}
public class ViewProject : BasePage {
protected override Label ErrorLabel {
get { return LocalErrorLabel; } // something defined in HTML template
set { throw new NotSupportedException(); }
}
}
这样你就可以在同一页面上拥有ticketId和projectId。
答案 1 :(得分:1)
要处理global.asax文件中的应用程序错误,您应该考虑使用为此目的设计的处理程序:
protected void Application_Error(object sender, EventArgs e)
{
//get exception causing event
Exception lastException = Server.GetLastError().GetBaseException();
//log exception, redirect based on exception that occurred, etc.
}
在web.config中定义maxRequestSizeKBytes
等“设置”
示例:
<system.web>
<httpRuntime maxRequestLength="305200" executionTimeout="120" />
</system.web>
答案 2 :(得分:0)
你可以尝试使用Server.Transfer这样的东西。 URL将保持不变。做一个Response.Redirect会再次向同一个页面发送一个302(有时可能会在无限循环中发送你。例如,在mypage.aspx的页面加载中尝试使用Response.Redirect(mypage.aspx))。
string errorPage = "~//Error.aspx";
Server.Transfer(errorPage, false);
HttpContext.Current.Server.ClearError();
HttpContext.Current.Response.ClearContent();
在任何一种情况下,您都应该将第二个参数设置为false以避免线程中止异常。恩。
Response.Redirect("mypage.aspx",false);
Server.Transfer("myerror.aspx",false);
答案 3 :(得分:0)
这些限制实际上限制在web.config中作为最佳做法,以防止人们在您的网站上执行DoS。您可能最好为用户提供有关文件大小限制的视觉提示,然后让标准错误处理程序接管。
http://msdn.microsoft.com/en-us/library/e1f13641.aspx
向用户提供错误详细信息并不是一个好主意;你应该保留为管理员。文件大小错误只是......错误,与验证无关,这是您应该向用户提供反馈的。