Asp.Net MVC:请求URL过长和错误处理

时间:2011-08-04 18:59:44

标签: asp.net-mvc iis-7 error-handling

通过检查我的elmah日志,我发现我一直收到“太长的网址”请求。错误是:

System.Web.HttpException (0x80004005): The length of the URL for this request exceeds the configured maxUrlLength value.
   at System.Web.HttpRequest.ValidateInputIfRequiredByConfig()
   at System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context)

以下是我收到的请求:

  

/index.php/blog/post/the_ten_deceptions_of_the_datetimepicker / + [PLM = 0] + GET HTTP +:/www.visualhint.com/index.php/blog/post/the_ten_deceptions_of_the_datetimepicker / + [0,23778,23037] + - > + [N] + POST HTTP +:/www.visualhint.com/index.php/blog/post/the_ten_deceptions_of_the_datetimepicker / + [0,0,2007]

(不要对php的事情感到惊讶......在成为asp.net mvc网站之前,我的网站是在php中,现在我需要将这种旧的URL重定向到我的新url格式,这很有效当网址停在/index.php/blog/post/the_ten_deceptions_of_the_datetimepicker)

  1. 什么可以产生这些请求?这听起来有恶意吗?

  2. 我有自定义错误设置,所以我虽然这样的请求会被重定向到我的自定义错误页面,但事实并非如此。相反,人们得到典型的黄色屏幕(萤火虫提到这是一个400 Bad Request)。如果你看一下上面的堆栈跟踪,它很短,异常似乎很早就被捕获(甚至没有调用Application_BeginRequest)。是否可以显示我的自定义错误页面,或者在发生此类异常时我是否至少可以重定向到我的主页?

  3. 我尝试在web.config中添加一行错误400:

    <customErrors mode="RemoteOnly">
        <error statusCode="400" redirect="/" />
    </customErrors>
    

    这会重定向到主页右侧,但会在aspxerrorpath查询字符串值中添加完整的URL。

    感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

谷歌搜索帮助我发现其他人得到了这种请求。有人回答:

  

我很确定这是一种自动提交垃圾邮件的方式。必有   是配置错误,因为它不应该留下这样的   在推荐人领域多汁的踪迹!

     

首先它告诉一些脚本获取一个URL,然后它指示发布到   一个URL(很容易阻止直接POST的垃圾邮件而不会得到   第一)。

     

这些数字可能与发布的垃圾邮件有关(想想   它作为垃圾邮件数据库中的索引。)

因此,由于很有可能这些请求不是来自正常链接的人类,我最终得到了以下解决方案。这样可以避免污染我的elmah日志,这会给调用者提供一个空白页面,其中包含404代码:

public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    HttpException hExc = e.Exception.GetBaseException() as HttpException;
    if (hExc != null)
    {
        if (hExc.ErrorCode == unchecked((int)0x80004005))
        {
            e.Dismiss();
            return;
        }
    }

    // Here I do some stuff if the error has to be logged.
}

void Application_Error(object sender, EventArgs e)
{
    Exception exc = Server.GetLastError();
    HttpException hExc = exc as HttpException;
    if (hExc != null)
    {
        if (hExc.ErrorCode == unchecked((int)0x80004005))
        {
            Uri uri = HttpContext.Current.Request.Url;

            Response.Clear();
            Response.StatusCode = 404;
            Response.End();

            Server.ClearError();
        }
    }
}

而不是返回404代码,我宁愿不发送响应(调用者会超时)但是可以使用asp.net吗?不知道......