97 votes

Pourquoi HttpContext.Current est null après await ?

J'ai le code WebAPI de test suivant, je n'utilise pas WebAPI en production mais je l'ai fait à cause d'une discussion que j'ai eue sur cette question : Question sur l'interface WebAPI asynchrone

Quoi qu'il en soit, voici la méthode WebAPI incriminée :

public async Task<string> Get(int id)
{
    var x = HttpContext.Current;
    if (x == null)
    {
        // not thrown
        throw new ArgumentException("HttpContext.Current is null");
    }

    await Task.Run(() => { Task.Delay(500); id = 3; });

    x = HttpContext.Current;
    if (x == null)
    {
        // thrown
        throw new ArgumentException("HttpContext.Current is null");
    }

    return "value";
}

J'avais cru jusqu'ici que la deuxième exception était attendue parce que, lorsque les await complète, ce sera probablement sur un autre fil de discussion où HttpContext.Current en tant que variable statique ne sera plus résolu à la valeur appropriée. Maintenant, sur la base du contexte de synchronisation, il pourrait être forcé de revenir au même thread après l'attente, mais je ne fais rien de compliqué dans mon test. C'est juste une simple utilisation naïve de await .

Dans les commentaires d'une autre question, on m'a dit que HttpContext.Current doit être résolu après une attente. Il y a même un autre commentaire sur cette question qui indique la même chose. Alors, qu'est-ce qui est vrai ? Doit-il être résolu ? Je pense que non, mais je veux une réponse faisant autorité sur ce point car async y await est assez récente pour que je ne puisse pas trouver quelque chose de définitif.

TL;DR : Est HttpContext.Current potentiellement null après un await ?

0voto

tvb2754 Points 77

J'ai essayé toutes les autres réponses ici et HttpContext.Current était toujours nulle.

.net Framework 4.6.1 / MVC

J'utilise HttpContext.Current pour obtenir le chemin mappé pour un téléchargement vers App_Data

C'est ainsi que j'ai résolu le problème :

J'obtiens juste le courant HttpContext.Current dans une variable, puis la réinitialiser après ma await appels.

var tempHttpContextCurrent = System.Web.HttpContext.Current;

var report = await reportingUtilities.GetReport(reportId, currentUserRubixId).ConfigureAwait(false);

// reset the HttpContext.Current after the await call.
System.Web.HttpContext.Current = tempHttpContextCurrent;

0voto

Juan Pablo Points 53

Dans mon cas, le problème est que j'ai oublié await au début de la pile, explicitement dans la méthode d'action de mon constructeur.

NOTE : Utilisation de net core 5.0 avec IHttpContextAccessor

Donc le problème était dans le code...

[HttpPost]
public async Task AnyAction()
{
    await service.MethodReturningTask(); //await was not
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X