Asp.Net MVC: запросы со слишком длинными URL и обработка ошибок - PullRequest
3 голосов
/ 04 августа 2011

Проверяя мой журнал elmah, я вижу, что получаю запросы «слишком длинный URL». Ошибка:

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 / блог / запись / 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, который хорошо работает когда URL останавливается на /index.php/blog/post/the_ten_deceptions_of_the_datetimepicker)

  1. Что может генерировать эти запросы? Это звучит злонамеренно?

  2. У меня настроены пользовательские ошибки, поэтому я, хотя такой запрос, будет перенаправлен на мою страницу пользовательских ошибок, но это не так. Вместо этого люди получают типичный желтый экран (пожарный упомянул, что это 400 плохих запросов). Если вы посмотрите на вышеприведенную трассировку стека, она очень короткая, и исключение, похоже, обнаруживается очень рано (Application_BeginRequest даже не вызывается). Можно ли показать свою пользовательскую страницу с ошибкой или я могу, по крайней мере, перенаправить на свою домашнюю страницу при возникновении такого исключения?

Я попытался добавить строку для ошибки 400 в моем файле web.config:

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

Это перенаправляет на главную страницу справа, но добавляет полный URL-адрес в значение строки запроса aspxerrorpath.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 05 августа 2011

Поиск в Google помог мне обнаружить, что некоторые другие люди получают такой запрос.Кто-то ответил:

Я почти уверен, что это автоматический способ отправки спама.В конфигурации должна быть ошибка, потому что она не должна оставлять такой пикантный след в поле реферера!

Сначала он сообщает некоторому сценарию, что нужно получить URL, затем он инструктирует публиковать на URL (это легкоблокировать спам, который отправляет POST напрямую, не получая сначала).

Числа могут относиться к тому, какие спам-сообщения (и) нужно публиковать (думать об этом как об индексах в БД спама).1010 * Итак, поскольку есть хорошие шансы, что эти запросы не от людей, следующих по обычным ссылкам, я получил следующее решение.Это позволяет избежать загрязнения моего журнала 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?Понятия не имею ...

...