Обновление ASP.NET Core 2.2 - IIS: ограничение длины содержимого запроса - PullRequest
0 голосов
/ 16 октября 2019

До сих пор мы использовали наши сервисы на ASP.NET Core 1.1. Мы только что обновились до ASP.NET Core 2.2, который прошел довольно гладко.

Однако мы размещаем службу Azure App в Windows, которая, в свою очередь, работает под управлением IIS.

Теперь у нас естьнастраиваемый раздел в web.config для ограничения максимальной длины контента, поэтому, когда пользователи загружают файлы, которые они знают перед фактической загрузкой, до предела, если их загрузка не удалась:

<?xml version="1.0" encoding="utf-8"?>
<configuration>    
    <location path="api/0.1/files">
        <system.web>
            <httpRuntime maxRequestLength="409600" executionTimeout="3600"/>
        </system.web>

        <system.webServer>
            <security>
                <requestFiltering>

                    <requestLimits maxAllowedContentLength="419430400" />
                </requestFiltering>
            </security>
        </system.webServer>
    </location>

  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore"
             path="*"
             verb="*"
             modules="AspNetCoreModule"
             resourceType="Unspecified"/>
      </handlers>
      <aspNetCore processPath="dotnet"
                  arguments=".\webapp.dll"
                  stdoutLogEnabled="false"
                  stdoutLogFile="\\?\%home%\LogFiles\stdout"
                  hostingModel="OutOfProcess"
                  forwardWindowsAuthToken="false"/>
    </system.webServer>
  </location>

</configuration>

Теперь вызывается маршрут api/0.1/files(и, конечно, все маршруты «под» файлами) приведут к 404 не найденному результату со следующим сообщением об ошибке:

Ресурс, который вы ищете, был удален, изменилось его имя или являетсявременно недоступно.

Единственное исправление, которое я смог найти, заключалось в глобальном ограничении длины контента:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore"
             path="*"
             verb="*"
             modules="AspNetCoreModule"
             resourceType="Unspecified"/>
      </handlers>
      <aspNetCore processPath="dotnet"
                  arguments=".\webapp.dll"
                  stdoutLogEnabled="false"
                  stdoutLogFile="\\?\%home%\LogFiles\stdout"
                  hostingModel="OutOfProcess"
                  forwardWindowsAuthToken="false"/>

      <security>
        <requestFiltering>
          <!--400 MByte-->
          <requestLimits maxAllowedContentLength="419430400" />
        </requestFiltering>
      </security>
    </system.webServer>
  </location>

</configuration>

Каков будет правильный способ установить ограничение вконкретный маршрут?

1 Ответ

1 голос
/ 18 октября 2019

Можно использовать location для установки предела для конкретного маршрута.

Кроме того, если вы хотите изменить максимальный предел размера тела запроса для конкретного действия или контроллера MVC, выможно использовать атрибут RequestSizeLimit.

// GET api/values/5
[HttpGet("{id}")]
[RequestSizeLimit(40000000)]
public ActionResult<string> Get(int id)
{
    return "value";
}

Он устанавливает максимально допустимую длину запроса для этого метода действия . Вы можете применить этот атрибут на уровне действия или уровне контроллера. Это рекомендуемый подход для увеличения лимита в приложении ASP.NET Core MVC.

...