web-dev-qa-db-fra.com

problème de délai d’API Web 2

J'ai une API Web .net principale et l'un des points de terminaison exécute une procédure stockée qui prend 3 à 4 minutes. L'API est déployée sur IIS. 

Lorsque je crée un httpGet, je reçois une erreur 502 Bad Gateway. En regardant le journal IIS, l'erreur est en réalité un délai d'attente. Ceci à partir de IIS Log: 

2018-11-28 17:24:48 10.71.12.59 GET /api/meetingreport fromDate=11/01/2018&toDate=11/30/2018&tradingGroup=All&symbol=&reviewed= 16000 - 10.6.50.61 Mozilla/5.0+(Windows+NT+6.1;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/64.0.3282.140+Safari/537.36 - 502 3 12002 120029

Le code d'erreur 12202 concerne ERR_WINHTTP_TIMEOUT . Le délai d'attente est atteint après 2 minutes. Demande prenant moins de 2 minutes fonctionne bien. Je l'ai vérifié en ajoutant un thread.sleep de plus et moins 2 minutes. 

[HttpGet("")]
        public async Task<IActionResult> Get([FromQuery(Name = "fromDate")] DateTime fromDate, 
                    [FromQuery(Name = "toDate")] DateTime toDate, [FromQuery(Name ="tradingGroup")]string tradingGroup, [FromQuery(Name = "symbol")]string symbol, [FromQuery(Name = "reviewed")]string reviewed)
        {
            try
            {
                if (fromDate == DateTime.MinValue || toDate == DateTime.MinValue) return BadRequest("fromDate and toDate is a required Field");
                tradingGroup = tradingGroup == "All" ? tradingGroup.Replace("All", "") : tradingGroup;
                tradingGroup = tradingGroup ?? string.Empty;
                symbol = symbol ?? string.Empty;
                var result = await _meetingReportRepository.GetMeetingReport(fromDate, toDate, tradingGroup, symbol, reviewed);
                Thread.Sleep(132000); // 2.2 minutes
                    return Ok(result);
            }
            catch (Exception ex)
            {
            }
            return BadRequest($"Couldn't Genererate Report");

        }

C'est l'erreur de POSTMAN. 

 enter image description here

Comment puis-je augmenter le délai d'attente à 10 minutes? Des pointeurs? Il n'y a pas de fichier Web.config. 

Après this post, j’ai mis à jour mon programme.cs pour ajouter KeepAliveTimeout de 10 minutes. Mais cela n'a pas aidé. Ma demande expire toujours après 2 minutes. 

public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseKestrel( o=> { o.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(10); })
            .Build();

EDIT 1: Lorsqu'il est déployé sur IIS, un fichier web.config est créé et comporte le contenu suivant: 

<?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=".\project.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    </system.webServer>
  </location>
</configuration>

Je vais ajouter un délai d'attente ici pour voir si cela fonctionne. 

EDIT 2: L'ajout de requestTimeout a fait l'affaire. IIS est très fidèle à web.config :). Mon problème est résolu.

<aspNetCore requestTimeout="00:20:00" processPath="dotnet" arguments=".\project.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
4
ProgSky

l'ajout de requestTimeout à web.config a résolu mon délai d'attente. 

<aspNetCore requestTimeout="00:20:00" processPath="dotnet" arguments=".\project.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />

Une meilleure approche consiste à lancer une requête puis à interroger le résultat suggéré par @ steve-land

1
ProgSky

Je me rends compte que cela ne répond pas spécifiquement à votre question, mais je suggérerais que le problème ici est davantage lié à la demande lente, et non aux délais d'attente du pipeline IIS/Postman/.Net associés.

Avez-vous envisagé de modifier votre flux de travail pour faire une seule demande de lancement du processus, puis de rechercher le résultat?

Par exemple. 

  1. Faites une demande POST pour démarrer le processus sur un processeur de gestion de tâches/tâches en arrière-plan et recevez immédiatement une sorte d'identifiant de processus identifiant votre nouveau processus.

  2. Interrogez périodiquement un autre point d'extrémité GET en utilisant le paramètre processId, jusqu'à ce que vous receviez le résultat une fois le processus terminé.

2
Steve Land

C'est peut-être le facteur qui arrive à expiration. Si tel est le cas, vous pouvez ajuster les paramètres de Postman.

https://www.getpostman.com/docs/v6/postman/launching_postman/settings

Fichier -> Paramètres -> Général: Expiration du délai de demande

Il se peut qu’il soit déjà par défaut à l’infini, je ne sais pas si je l’ai changé manuellement.

Juste une pensée.

Gina

0
Gina Marano