#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 .