8
votes

Comment injecter la valeur HTTPHeader dans le contrôleur?

J'ai une API Web développée à l'aide de API ASP.NET COE. Chaque demande entrante a une valeur d'en-tête personnalisée insérée. Par exemple, x-corrélationid code>. Le contrôleur utilise cette valeur pour la journalisation et la traçage de la demande. Actuellement, je lis la valeur dans chaque contrôleur comme ci-dessous

[Route("api/[controller]")]
public class DocumentController : Controller
{
    private ILogger<TransformController> _logger;
    private string _correlationid = null;

    public DocumentController(ILogger<DocumentController > logger)
    {
        _logger = logger;
        _correlationid = HttpContext.Request.Headers["x-correlationid"];
    }

    [HttpPost]
    public async Task<intTransform([FromBody]RequestWrapper request)
    {
        _logger.LogInformation("Start task. CorrelationId:{0}", _correlationid);

         // do something here

        _logger.LogInformation("End task. CorrelationId:{0}", _correlationid);

        return result;
    }
}


1 commentaires

Stackoverflow.com/help/tagging Veuillez ne pas forcer les tags dans le titre de la question


3 Réponses :


12
votes

Au lieu de lire la valeur dans le constructeur du contrôleur, je souhaite injecter la valeur dans le constructeur du contrôleur.

Vous ne pouvez pas injecter la valeur elle-même dans le constructeur du contrôleur API, car au moment de la construction, le httpcontext sera null .

une option "style d'injection" serait d'utiliser le deheaderattribute dans vos actions: xxx

Le middleware peut lire le x-corrélationid et en quelque sorte le rendre disponible pour tous les contrôleurs afin de ne pas avoir à l'injecter dans un contrôleur?

Je pense qu'une solution middleware serait probablement surcharger pour ce dont vous avez besoin. Au lieu de cela, vous pouvez créer une classe de base personnalisée qui dérive de contrôleur et que tous vos contrôleurs d'API dérivent de cela. xxx


1 commentaires

Merci pour les informations sur deheaderattribute .



4
votes

C'est ce que je suis venu avec. Je pense que je peux aussi le tester.

[Route("api/[controller]")]
public class DocumentController : Controller
{
    private ILogger<TransformController> _logger;
    private IRequestContext _requestContext = null;

    public DocumentController(ILogger<DocumentController > logger,IRequestContext requestContext)
    {
        _logger = logger;
        _requestContext = requestContext;
    }

    [HttpPost]
    public async Task<intTransform([FromBody]RequestWrapper request)
    {
        _logger.LogInformation("Start task. CorrelationId:{0}", _requestContext.CorrelationId);

         // do something here

        _logger.LogInformation("End task. CorrelationId:{0}", _requestContext.CorrelationId);

        return result;
    }
}


0 commentaires

2
votes

Selon vos besoins, l'un des éléments suivants convient:

  • Si vous avez besoin de vos valeurs d'en-tête au niveau de l'action, utilisez-vous de la tête-de-TheAreTtribue, meilleur (plus léger et plus facile).
  • Si vous devez utiliser cette valeur d'en-tête dans des couches inférieures telles que le référentiel ou DAL, qui sera instancié avant que le contrôleur ait été initialisé, alors envisagez d'utiliser Middleware pour obtenir des valeurs d'en-tête initialisées et disponibles pour d'autres composants.

0 commentaires