Почему запрос, который превышает указанное значение 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 КБ, и моя загрузка работает.


person Community    schedule 12.02.2016    source источник
comment
Насколько я понимаю, вы должны увидеть сообщение об ошибке максимальной длины. Возможно, у вас есть несколько ошибок, и эта возвращается еще до того, как вы достигнете максимальной длины, см. ссылку, чтобы исправить вашу текущую ошибку, надеюсь, она обнаружит ту, которую вы ищете stackoverflow.com/questions/16102957/   -  person aemorales1    schedule 18.02.2016
comment
Это прекрасно работает с файлом приемлемого размера @aemorales1. Спасибо за ответ.   -  person    schedule 19.02.2016
comment
Используете ли вы [ValidateAntiForgeryToken] в каких-либо своих действиях? Может быть, вы видите результат перенаправления на одно из этих действий?   -  person DigitalDan    schedule 22.02.2016


Ответы (3)


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

1 Mb = 1024kb

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

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

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

person Binh LE    schedule 22.02.2016

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

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

person DigitalDan    schedule 22.02.2016

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

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

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

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

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

person Dennis Wanyonyi    schedule 22.02.2016