Большие запросы POST вызывают тайм-аут в Asp. Net Web API при использовании клиентских сертификатов. - PullRequest
2 голосов
/ 28 января 2020

Фон

Наш API позволяет пользователям загружать большие файлы, такие как PDF, JPG и PNG. Недавно мы получили тонну запросов, которые истекают, когда сервер простаивает некоторое время. Наши клиенты будут ждать 2 минуты, а затем получат сообщение об ошибке 500.

Мы используем Azure Управление API для предоставления клиентам документации и доступа к API.

Клиент -> Управление API -> Веб-приложение

Однако, если посмотреть на понимание, становится ясно, что проблема заключается в управлении API и нашим веб-приложением, в котором мы настроили SSL-сертификат .

Проблема

Проблема, как представляется, заключается в том, что отправка большого запроса POST, содержащего сертификат SSL для «пробуждения» API, делает его тупиковым. Я также отлаживал API, используя понимание приложения, но кажется, что запрос вообще не получен ни одной операцией.

После отладки проблемы с совершенно новым проектом Web API и Web App у меня есть сужается до того, что тайм-аут возникает только в том случае, если:

  • Сервер настроен только для HTTPS и / или требуется сертификат клиента.
  • Я оставлю сервер на 5-10 минут перед отправкой моего первого запроса.
  • Мой первый запрос содержит большой файл, например PDF-файл размером 2 МБ.

Для устранения проблемы я настроил следующие ресурсы.

Web API

Я создал новый проект, ASP. NET Web API, framework 4.6. Я добавил только простой файловый контроллер.

using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace DebugCertificate.API.Controllers
{
    public class FilesController : ApiController
    {

        public HttpResponseMessage Post()
        {
            // Success
            return Request.CreateResponse(HttpStatusCode.OK, "Welcome to the POST files resource!");
        }

        public HttpResponseMessage Get()
        {
            // Success
            return Request.CreateResponse(HttpStatusCode.OK, "Welcome to the GET files resource!");
        }

    }
}

Веб-приложение

Я установил совершенно новое Azure Веб-приложение и настроил его со следующими настройками.

Configuration - General settings

TLS/SSL settings - Protocol settings

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

  1. Подождите 5-10 минут.
  2. Отправьте запрос POST на ресурс / api / files, содержащий большой файл (в данном случае 2 МБ).
  3. Тайм-аут наступает через 120 секунд.
  4. Пока вы отправляете только большой запрос POST, вы можете повторить шаг 2.

Обратите внимание, что мне даже не нужно отправлять клиента сертификат с этим запросом на возникновение проблемы.

Postman request

Проблема не возникнет

  • Когда требуется сертификат клиента и отключен только HTTPS.
  • Когда вы сначала отправляете запрос GET / api / files и в течение 5-10 минут отправляете тот же запрос POST, который описан в шаге 2 выше.
* 108 6 * Возможные отведения

После диагностики веб-приложения в Azure я обнаружил ошибки, сгенерированные этими запросами. Я гуглил это описание, но не нашел никакой информации, которая бы исправила мои проблемы.

Diagnose and solve problems - Diagnose and solve problems - HTTP 4xx Errors

Я нашел что-то похожее, но эта статья звучит так это между клиентом и API-интерфейсом, где мы не настроили SSL-сертификат. Ищите зеленое поле TIP.

Как защитить API с помощью аутентификации сертификата клиента в управлении API

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

Запрос сертификата клиента HTTPS зависает, когда Сервер обрабатывает большой запрос PUT / POST

Вопросы

  1. Почему это происходит?
  2. Есть ли обходной путь, который не включает "заправку" API? Может быть, простая настройка Web.config?

Позвольте мне сейчас, если потребуется дополнительная информация!

1 Ответ

0 голосов
/ 29 января 2020

Go к вашему домену в пользовательских доменах, нажмите на доменное имя прокси и затем отметьте опцию согласования сертификата клиента.

Если вы используете уровень потребления, то включите опцию запроса сертификата клиента.

https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-mutual-certificates-for-clients

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...