Почему запрос, превышающий указанный maxRequestLength, отвечает (на первый взгляд) нерелевантной ошибкой?
Я указал maxRequestLength
в моем web.config (MVC) вот так:
<location path="File/Upload">
<system.web>
<httpRuntime maxRequestLength="330"/>
</system.web>
</location>
При просмотре вкладки сети во время тестирования загрузки файлов, размер которой превышает 330 КБ, я вижу ответ от сервера: 500
и детали The required anti-forgery form field "__RequestVerificationToken" is not present.
Почему это так? Является ли структура не способной предоставить детали maxRequestLength
в ответ? Или просто не хочет, чтобы не разглашать информацию о системе?
Или же мой запрос был обрезан / обрезан для того, чтобы обойти ограничение, которое непреднамеренно обрезало токен подтверждения запроса?
НОТА
Это прекрасно работает с файлами, которые не превышают 330 КБ, и моя загрузка работает.
3 ответа
Я подозреваю, что одно из ваших действий (не обязательно то, которое обрабатывает загрузку файла) имеет [ValidateAntiForgeryToken]
атрибут, и что вы как-то видите ошибку, исходящую от этого действия вместо этого.
Я предлагаю временно закомментировать все [ValidateAntiForgeryToken]
атрибуты в вашем проекте, чтобы увидеть, что на самом деле возвращается, когда вы пытаетесь загрузить файлы, которые превышают ограничение.
Я вижу, вы установили maxRequestLength равным 330, это предел для загрузки файла. это значение соответствует правилу ниже:
1 Мб = 1024 Кб
как вы можете увидеть более подробно на:
Поэтому, когда вы установите maxRequestLength="330", система поймет, что размер загружаемого файла ограничен 330 КБ.
Я попытался воссоздать проблему в примере проекта, но после дальнейших исследований я обнаружил, что действия контроллера ASP.NET MVC не используют элемент location в файле web.config. Это связано с тем, что в отличие от ASP.NET, который отображает файл на диск, ASP.NET MVC использует маршрутизацию. Вы можете проверить ответ по ссылке ниже, которая, хотя и относится к другому вопросу, отмечает, что тег местоположения не используется.
В этом случае каркас, скорее всего, не сможет применить ограничение к размеру файла для действия Upload.
Я не совсем уверен, так как не могу воссоздать 500 внутреннюю ошибку сервера, но я думаю, что это может быть из-за того, что фреймворк не может правильно интерпретировать ваш web.config из-за элемента location.
Что касается ошибки, связанной с маркером защиты от подделки, убедитесь, что он присутствует в вашем представлении (с помощью @ Html.AntiForgeryToken ()) и что ни один сценарий не удаляет его из DOM, прежде чем отправлять форму