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;
}
}
3 Réponses :
Au lieu de lire la valeur dans le constructeur du contrôleur, je souhaite injecter la valeur dans le constructeur du contrôleur. P>
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 code> sera
null code>. p >
une option "style d'injection" serait d'utiliser le
deheaderattribute code> dans vos actions: p>
xxx pré> Le middleware peut lire le x-corrélationid et en quelque sorte em> le rendre disponible pour tous les contrôleurs afin de ne pas avoir à l'injecter dans un contrôleur? P> BlockQuote>
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 code> et que tous vos contrôleurs d'API dérivent de cela. P>
xxx pré> blockQuote>
Merci pour les informations sur deheaderattribute code>.
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; } }
Selon vos besoins, l'un des éléments suivants convient: P>
Stackoverflow.com/help/tagging Veuillez ne pas forcer les tags dans le titre de la question