ОШИБКА 414 HTTP веб-приложения Azure — слишком длинный URL-адрес запроса

#angular #azure #.net-core

#angular #azure #.net-core

Вопрос:

Наше Dot Net Core 5 размещено в веб-приложении Linux Azure, которое содержит веб-приложения angular 12.

 this.router.navigate([]).then((result) => {
            window.open('/flight/flight-book?flightdata='   encodeURIComponent(this.encryptData(hiddenvalue)), '_blank');
        });
 

Теперь приведенный выше код запускается в браузере с ошибкой — ОШИБКА HTTP 414 — URL слишком длинный, но работает на локальном хосте, он работает нормально.

Мы считаем, что веб-приложение Azure останавливает отображение этого URL-адреса в браузере. Даже в web.config мы упоминаем приведенный ниже код, но он все еще не работает.

 <system.webServer>
    <!--   Here you have other settings related to handlers.-->
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="10485760" maxUrl="1000241" maxQueryString="3002768" />
      </requestFiltering>
    </security>
  </system.webServer>

 

Комментарии:

1. Какова фактическая длина URL-адреса, сгенерированного с использованием выражения '/flight/flight-book?flightdata=' encodeURIComponent(this.encryptData(hiddenvalue)) , вызывающего 414 ошибку?

2. Да, длина представляет собой длинную зашифрованную строку, но при запуске на локальном хосте все хорошо, только после развертывания в веб-приложении Azure получение HTTP 414.

Ответ №1:

Службы приложений Azure для Linux выполняются в контейнере, поэтому, если вы отправляете HTTP-запрос в свою службу приложений, он сначала обрабатывается обратным прокси-сервером в Azure вне вашего контроля, а затем запрос пересылается вашему приложению в контейнере. Ваш web.config не влияет на обратный прокси-сервер, и это компонент, который будет применять ограничение URL. Я только что протестировал его, и кажется, что максимальная длина запроса, которая все еще принимается в службах приложений Linux, составляет 8192 символа.

В службах приложений Windows по умолчанию ограничение составляет 2048 символов, но здесь вы можете управлять сервером напрямую и web.config так далее…

 <?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.web>
      <httpRuntime maxUrlLength="32768" maxQueryStringLength="32768" />
   </system.web>
   <system.webServer>
      <security>
         <requestFiltering>
            <requestLimits maxQueryString="32768" />
         </requestFiltering>
      </security>
   </system.webServer>
</configuration>
 

…установит максимальную длину URL-адреса в 32768 символов.

При этом, как вы только что испытали, иногда браузеры и серверы определяют ограничения URL или строки запроса, которые вы не всегда можете контролировать — лучше переместить более длинные данные в тело HTTP.

Ответ №2:

Я решил это с помощью localStorage API, наконец, я могу работать с длинным текстовым значением для нескольких страниц в приложении.

 localStorage.setItem("flightinfo", JSON.stringify(this.countries));//set value
localStorage.getItem('flightinfo'   paramGuid);//get value
 

У меня все работает, спасибо.