IIS: 502 при публикации составных данных/форм и использовании ARR

#iis #file-upload #multipartform-data #arr

Вопрос:

У нас есть классический ASP.NET веб-api, предоставляющий конечную точку загрузки файлов. Загрузка файла принимает запрос на данные из нескольких частей/форм, содержащий файл. Формат такой:

 POST https://dev.appname.com/api/v2/visitors/{{visitorId}}/attachments/upload
X-API-Key: {{apiKey}}
Content-Type: multipart/form-data; boundary=XXX

--XXX
Content-Disposition: form-data; name="image"; filename="filename.png"
Content-Type: image/png

{{ file bytes }}
--XXX--
 

Мы используем следующую переписку:

 <rule name="Rewrite to dev REST API" enabled="true" stopProcessing="true">
    <match url="api/(v[0-9] /.*)" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_HOST}" matchType="Pattern" pattern="(dev|dev-testing).appname.com" ignoreCase="true" negate="false" />
    </conditions>
    <action type="Rewrite" url="https://restapidev.appname.com/api/{R:1}?tenant={C:1}" appendQueryString="true" />
</rule>
 

Таким образом, URL-адрес переписывается с: https://dev.appname.com/api/v2/visitors/{{Идентификатор посетителя}}/вложения/загрузка Для https://restapidev.appname.com/api/v2/visitors/{{Идентификатор посетителя}}/вложения/загрузка?арендатор=разработчик

Это дает нам ответ 502.

При попадании в https://restapidev.appname.com/api… url напрямую, запрос выполнен успешно.

Чтобы диагностировать проблему, я записываю тело запроса в файл:

     private async Task SaveRequestBody() {
      var req = HttpContext.Current.Request;
      using var fileStream = File.OpenWrite($"C:\temp\{DateTime.Now:yyyy-MM-dd-HH-mm-ss}-UploadAttachment.txt");
      await req.GetBufferedInputStream().CopyToAsync(fileStream);
    }
 

Я замечаю, что:

  • При просмотре имени приложения разработчика… url:
    • ❌ записывается пустой файл
  • При просмотре restapidev.appname… URL-адрес
    • ✅ полный запрос, включая загрузку, записывается в файл
  • При загрузке файла без данных из нескольких частей/форм (Тип содержимого: изображение/png, байты, размещенные непосредственно в теле запроса)
    • ✅ полный запрос, включая загрузку, записывается в файл

Ведение журнала приложений, по-видимому, указывает на то, что приложение «зависает» при чтении потока запросов.

Я включил отслеживание неудачных запросов и заметил это:

  • В 12:36:37.144: GENERAL_READ_ENTITY_START
  • В 12:38:37.504: GENERAL_READ_ENTITY_END (2 минуты спустя!!)
    • BytesReceived=»0″, Код ошибки=»Операция ввода-вывода была прервана из — за выхода из потока или запроса приложения. (0x800703e3)»

К вашему сведению: REWRITE_DISABLED_KERNEL_CACHE В трассировке также есть предупреждение, но успешные запросы также содержат это предупреждение.

Я не смог добавить сюда полный журнал (из-за ограничений по длине поста).

Таким образом, наше веб-приложение, похоже, «зависает» при чтении тела запроса:

  • только для загрузки данных из нескольких частей/форм
  • только при маршрутизации через ARR

Есть ли что-то, что может быть неправильно настроено?

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

1. Эта ссылка должна помочь вам: Устранение 502 ошибок в ARR .