HTTP 400. Размер заголовка запроса слишком длинный
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Request Too Long</h2>
<hr><p>HTTP Error 400. The size of the request headers is too long.</p>
</BODY></HTML>
У меня есть aC# web api вместе с angularjs webapp, который ведет себя довольно странно на сервере развертывания.
Он случайным образом выдает ошибку 400 Bad Request для тех же вызовов Web API, которые работали секунду назад. Первоначально удаление файлов cookie и очистка кеша исправили бы эти ошибки, но с последних нескольких дней даже это не работает.
Я проверил мой размер заголовка, он находится в определенных пределах. У меня есть 4 куки почти 4 МБ каждый, так что это не должно быть проблемой.
Кроме того, это происходит только в среде QA (с балансировкой нагрузки на 2 блока), но не в других средах.
Какие-либо предложения?
РЕДАКТИРОВАТЬ: Вот ответ браузера Плохой запрос - слишком длинный запрос HTTP Ошибка 400. Размер заголовков запроса слишком длинный.
2 ответа
Проблема заключалась в большом размере файла cookie, вызванном слишком большим количеством утверждений, которые я хранил в нем. Устранена проблема за счет уменьшения количества претензий (пользовательских претензий), которые не нужны, и теперь они работают нормально.
В будущем нужно будет найти альтернативные способы передачи претензий пользователя, если приложение действительно имеет столько претензий.
У нас возникла аналогичная проблема, и мы не смогли сократить количество заявок, поскольку наш единый вход проходит через каждую группу AD, членом которой является пользователь, а многие из наших пользователей состоят в большом количестве групп.
Я нашел ответ, который мне помог, в StackOverflow:
Проверьте MSDN:
Причина
Эта проблема может возникнуть, если пользователь является членом многих групп пользователей ActiveDirectory. Когда пользователь является членом большого количества групп ActiveDirectory, размер токена аутентификации Kerberos для пользователя увеличивается. HTTP-запрос, который пользователь отправляет на сервер IIS, содержит токен Kerberos в заголовке WWW-Authenticate, а размер заголовка увеличивается по мере увеличения количества групп. Если размер заголовка или пакета HTTP превышает ограничения, настроенные в IIS, IIS может отклонить запрос и отправить эту ошибку в качестве ответа.
Разрешение
Чтобы обойти эту проблему, выберите один из следующих вариантов:
А) Уменьшите количество групп ActiveDirectory, членом которых является пользователь.
ИЛИ
Б) Измените параметры реестра MaxFieldLength и MaxRequestBytes на сервере IIS, чтобы заголовки запросов пользователя не считались слишком длинными. Чтобы определить соответствующие параметры для записей реестра MaxFieldLength и MaxRequestBytes, используйте следующие вычисления:
Рассчитайте размер токена Kerberos пользователя, используя формулу, описанную в следующей статье:
Новое решение проблем с проверкой подлинности Kerberos, когда пользователи принадлежат многим группам http://support.microsoft.com/kb/327825
Настройте ключи реестра MaxFieldLength и MaxRequestBytes на сервере IIS со значением 4/3 * T, где T — размер токена пользователя в байтах. HTTP кодирует токен Kerberos с использованием кодировки Base64 и, следовательно, заменяет каждые 3 байта в токене 4 байтами в кодировке Base64. Изменения, внесенные в реестр, не вступят в силу, пока вы не перезапустите службу HTTP. Кроме того, вам, возможно, придется перезапустить все связанные службы IIS.
Если для MaxFieldLength установлено максимальное значение 64 КБ, значение реестра MaxTokenSize должно быть установлено равным 3/4 * 64 = 48 КБ.