web-dev-qa-db-fra.com

Azure ASP .net WebApp La demande a expiré

J'ai déployé une application Web ASP .net MVC sur le service Azure App.

Je fais une demande GET depuis mon site vers une méthode de contrôleur qui obtient des données de DB (DbContext). Parfois, le processus d'obtention des données de la base de données peut prendre plus de 4 minutes. Cela signifie que ma demande n'a aucune action de plus de 4 minutes. Après cela, Azure tue la connexion - je reçois un message:

500 - La demande a expiré.

Le serveur Web n'a pas répondu dans le délai spécifié.

Ceci est un exemple de méthode:

 [HttpGet]
    public async Task<JsonResult> LongGet(string testString)
    {            
       var task = Task.Delay(360000);
        await task;            
        return Json("Woke", JsonRequestBehavior.AllowGet);
    }

J'ai vu beaucoup de questions comme celle-ci, mais je n'ai obtenu aucune réponse:

Ne fonctionne pas 1 Impossible de donner un autre lien - la réputation est trop faible.

J'ai lu ceci article - il s'agit d'Azure Load Balancer qui n'est pas disponible pour les webapps, mais il est écrit que la manière courante de gérer mon problème dans Azure webapp utilise TCP Keep-alive. J'ai donc changé de méthode:

[HttpGet]
    public async Task<JsonResult> LongPost(string testString)
    {
        ServicePointManager.SetTcpKeepAlive(true, 1000, 5000);
        ServicePointManager.MaxServicePointIdleTime = 400000;
        ServicePointManager.FindServicePoint(Request.Url).MaxIdleTime = 4000000;
       var task = Task.Delay(360000);
        await task;            
        return Json("Woke", JsonRequestBehavior.AllowGet);
    }

Mais obtenez toujours la même erreur. J'utilise une simple requête GET comme

GET /Home/LongPost?testString="abc" HTTP/1.1
Host: longgetrequest.azurewebsites.net
Cache-Control: no-cache
Postman-Token: bde0d996-8cf3-2b3f-20cd-d704016b29c6

Je cherche donc la réponse, qu'est-ce que je fais mal et comment augmenter le délai d'expiration des demandes dans Azure Web App. Toute aide est appréciée.

Paramètre Azure sur le portail:

Sockets Web - Activé

Toujours allumé - allumé

Paramètres de l'application:

SCM_COMMAND_IDLE_TIMEOUT = 3600

WEBSITE_NODE_DEFAULT_VERSION = 4.2.3

20
Pavel

230 secondes . C'est ça. Il s'agit du délai d'expiration de la demande en vol dans Azure App Service. Il est codé en dur dans la plate-forme, donc TCP Keep-Alives ou non, vous êtes toujours lié par elle.

Source - voir la réponse de David Ebbo ici:
https://social.msdn.Microsoft.com/Forums/en-US/17305ddc-07b2-436c-881b-286d1744c98f/503-errors-with-large-pdf-file?forum = windowsazurewebsitespreview

Il y a un délai de 230 secondes (c'est-à-dire un peu moins de 4 minutes) pour les demandes qui ne renvoient aucune donnée. Après cela, le client obtient le 500 que vous avez vu, même si en réalité la demande est autorisée à continuer côté serveur.

Sans en savoir plus sur votre application, il est difficile de suggérer une approche différente. Cependant, ce qui est clair, c'est que vous avez besoin d'une approche différente -

Peut-être retourner un 202 Accepted à la place avec un en-tête Location pour interroger le résultat plus tard?

39
evilSnobu