Ajouter un en-tête personnalisé pour toutes les réponses dans l'API Web
Simple question, et je suis sûr qu'il a une réponse simple, mais je ne le trouve pas.
Je suis en utilisant WebAPI et je voudrais envoyer un en-tête personnalisé pour toutes les réponses (serveur de date/heure demandée par un dev pour la synchronisation des fins).
Je suis actuellement en difficulté pour trouver un exemple clair de la façon dont, en un seul lieu (via le système global.asax ou un autre emplacement central) je peux obtenir un en-tête personnalisé à apparaître pour toutes les réponses.
Réponse acceptée, voici mon filtre (à peu près la même) et la ligne j'ai ajouté à la fonction Registre de la WebApi config.
REMARQUE: DateTime truc est NodaTime, pas de véritable raison était intéressé à regarder.
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
actionExecutedContext.Response.Content.Headers.Add("ServerTime", Instant.FromDateTimeUtc(DateTime.Now.ToUniversalTime()).ToString());
}
Config Ligne:
config.Filters.Add(new ServerTimeHeaderFilter());
Vous devez vous connecter pour publier un commentaire.
Pour cela, vous pouvez utiliser un ActionFilter (
System.Web.Http.Filters
)Vous pouvez ensuite appliquer le filtre à tous de votre contrôleur en ajoutant ceci dans la configuration Globale.asax par exemple :
Vous pouvez également appliquer le filtre d'attribut à l'action que vous voulez sans le mondial cofiguration ligne.
null
cependant. Vous devriez faireactionExecutedContext.Response.Headers.Add
à la place.Julian réponse m'a conduit à avoir pour créer le filtre, mais seulement en utilisant le Système.Web (v4) et du Système.Web.Http (v5) de l'espace de noms (MVC paquets n'ont pas été une partie de ce projet particulier, cela a été utilisée.)
Et l'ajouter à la mondiale.asax pour l'avoir utilisé sur chaque contrôleur/action
Précédentes réponses à cette question n'est pas l'adresse que faire si votre contrôleur de l'action déclenche une exception. Il existe deux méthodes de base pour obtenir que cela fonctionne:
Ajouter un filtre d'exception:
et dans votre WebApi de l'installation:
Cette approche fonctionne, parce WebApi par défaut du gestionnaire d'exception enverra le HttpResponseMessage créé dans un filtre au lieu de construire son propre.
Remplacer le gestionnaire d'exceptions par défaut:
et dans votre WebApi de l'installation:
Vous ne pouvez pas utiliser ces deux ensemble. Bon, eh bien, vous pouvez, mais le maître ne fera jamais rien parce que le filtre déjà converti à l'exception d'une réponse.
Super important de noter que comme l'écrit, ce code va envoyer tous les détails de l'exception pour le client. Vous ne voulez probablement pas à le faire dans la production, afin de vérifier tous les surcharges sur CreateErrorResponse() et de choisir celui qui convient à vos besoins.
Aucune de ces deux solutions a fonctionné pour moi. Ils n'auraient même pas compiler. Voici ce que j'ai fait. Ajouté:
à
RegisterGlobalFilters(GlobalFilterCollection filters)
méthode dans FiltersConfig.cs et ensuite ajoutéConformément à ma demande, ci-dessous une seule ligne de code sert l'objectif.
IEnumerable<string> vals;
response.Headers.TryGetValues("Key", out vals);
string value = vals?.FirstOrDefault();
Il peut être fait par le messagehandler facilement, il permettra de gérer à la fois la réponse ok et cas d'exception.
Ajouter dans la config
J'ai combiné la normale et à l'exception de chemin d'accès dans une même classe:
Rien de compliqué, mais au moins ça me donne une place pour contrôler mes en-têtes supplémentaires. Pour l'instant c'est juste du contenu statique, mais vous avez toujours la possibilité de le raccorder à une sorte de dictionnaire générateur d'usine.
J'ai eu le même problème en essayant d'ajouter un nouvel en-tête pour l'ensemble du contrôleur, il suffit d'ajouter "des services.AddHttpContextAccessor();" pour le démarrage.cs puis de créer votre contrôleur
HTML: