Почему запрос, превышающий указанный 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 &quot;__RequestVerificationToken&quot; is not present.

Почему это так? Является ли структура не способной предоставить детали maxRequestLength в ответ? Или просто не хочет, чтобы не разглашать информацию о системе?

Или же мой запрос был обрезан / обрезан для того, чтобы обойти ограничение, которое непреднамеренно обрезало токен подтверждения запроса?

НОТА

Это прекрасно работает с файлами, которые не превышают 330 КБ, и моя загрузка работает.

3 ответа

Я подозреваю, что одно из ваших действий (не обязательно то, которое обрабатывает загрузку файла) имеет [ValidateAntiForgeryToken] атрибут, и что вы как-то видите ошибку, исходящую от этого действия вместо этого.

Я предлагаю временно закомментировать все [ValidateAntiForgeryToken] атрибуты в вашем проекте, чтобы увидеть, что на самом деле возвращается, когда вы пытаетесь загрузить файлы, которые превышают ограничение.

Я вижу, вы установили maxRequestLength равным 330, это предел для загрузки файла. это значение соответствует правилу ниже:

1 Мб = 1024 Кб

как вы можете увидеть более подробно на:

https://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.maxrequestlength(v=vs.110).aspx

Поэтому, когда вы установите maxRequestLength="330", система поймет, что размер загружаемого файла ограничен 330 КБ.

Я попытался воссоздать проблему в примере проекта, но после дальнейших исследований я обнаружил, что действия контроллера ASP.NET MVC не используют элемент location в файле web.config. Это связано с тем, что в отличие от ASP.NET, который отображает файл на диск, ASP.NET MVC использует маршрутизацию. Вы можете проверить ответ по ссылке ниже, которая, хотя и относится к другому вопросу, отмечает, что тег местоположения не используется.

Как разрешить всем пользователям доступ к одному маршруту на веб-сайте с интегрированной аутентификацией?

В этом случае каркас, скорее всего, не сможет применить ограничение к размеру файла для действия Upload.

Я не совсем уверен, так как не могу воссоздать 500 внутреннюю ошибку сервера, но я думаю, что это может быть из-за того, что фреймворк не может правильно интерпретировать ваш web.config из-за элемента location.

Что касается ошибки, связанной с маркером защиты от подделки, убедитесь, что он присутствует в вашем представлении (с помощью @ Html.AntiForgeryToken ()) и что ни один сценарий не удаляет его из DOM, прежде чем отправлять форму

Другие вопросы по тегам