J'ai une API d'ASP.NET CORE qui ajoute deux en-têtes à sa réponse La chose étrange (pour moi) est que dans mon Ajax Appelez au service, les en-têtes font partie des données JSON, en tant que tableau des en-têtes, plutôt que la requête car le code code> est également une partie des données Cela signifie que mon rappel de réussite Ajax est toujours appelé, même lorsque je teste une réponse de 400 mauvaises réponses, ce qui rend les tests moins simples. P> Contrôleur d'API Web: fort> p> suis-je en train de faire quelque chose de mal sur le serveur -Side? p> p> callback_uri code> et
redirect_uri code>.
Demander Code>. Je ne peux pas utiliser
jQxhr.getresponseheader (...) code> et doit donc interroger manuellement le tableau des en-têtes manuellement dans les données de réponse. P>
3 Réponses :
ajoutez des en-têtes comme ceci: (OFC change le type si nécessaire ou définissez le vôtre) P>
intervention.Content.Contenttype = nouveau MediatypeHervalue ("Texte / plaine"); Code> P>
Vous pouvez utiliser une combinaison de RésultatFilters et Servicefilterattribute pour ajouter vos en-têtes personnalisés. Ceci est particulièrement utile car:
ServiceFilter Code> vous permet d'avoir un accès di dans votre résultatFilter. li>
- Vous pouvez l'appliquer comme un attribut
code> dans les actions que vous souhaitez li>
- Vous pouvez le tester. LI>
ol>
Mettre tous ensemble: P>
- Créer la classe de filtres de résultat personnalisée li>
ol>
xxx pré>
- Enregistrez-le dans votre
startup.configureservices CODE> LI>
ol> xxx pré>
- Appliquez l'attribut dans l'action que vous souhaitez renvoyer les en-têtes personnalisés li>
OL>
<script>
var settings = { method: "GET" };
$.ajax('http://localhost:61284/api/values/test', settings)
.done(function (data, textStatus, xhr) {
alert(xhr.getResponseHeader('my-header'));
})
.fail(function () {
alert("error");
});
</script>
J'ai délibérément découplé de l'utilisation du pipeline de demande puisqu'il effectue des tests unitaires très difficiles.
Bien sûr, je te comprends. C'était juste un exemple rapide, mais la même chose peut être réalisée en créant un middleware. Quelque chose comme ça peut vous aider à commencer. andrewlock.net/adding-default-security-headers-in -Ap-Net-CO RE ou filtres d'action: docs.microsoft.com/en-us/aspnet/core/mvc/controls/...
@Lee Vous faites probablement une demande de Cors, non? Si tel est le cas, n'oubliez pas que vous devez ajouter le Access-Control-exose-têtes CODE>, sinon, vous ne pouvez pas lire vos en-têtes personnalisés à l'aide de
xhr.getresponseheer code>
J'ai l'interface utilisateur et les services tout sous le même site de IIS, alors malheureusement, je ne pense pas que ce soit le problème. Je suppose que c'est juste la façon dont les poignées Web API 2 HTTPRESPONSEMESSAGE CODE>
Eh bien .. c'est étrange et il est difficile de dire grand chose sans le voir. Je mette à jour ma réponse avec une meilleure approche et je viens de tester et ça marche comme un charme. Donnez-lui une course et voyez si fonctionne (essayez d'habiliter Cors ..)
Ce que vous faites est de créer un objet Qu'est-ce que vous pouvez faire, c'est quelque chose comme ça: p> httpresponsemessage code>, sérialisant-le à JSON puis de le renvoyer.
C'est pourquoi les en-têtes sont dans le contenu JSON, au lieu de la réponse HTTP.
J'ai fait le choix de ne pas compter sur réponse code> afin que je puisse tester beaucoup plus facilement. Je sais que c'est être sérialisé comme Json comme je peux le voir dans le réseau de navigateur Sniffer. Je pense que les filtres pourraient être la seule voie à suivre, comme Jpgrassi l'a mentionné.
Si vous avez besoin de cette logique à plusieurs endroits, alors oui, les filtres seraient une bonne approche.
Puissiez-vous montrer le code d'appel AJAX?
Je l'ai laissé parce que c'est si trivial, mais je vais l'ajouter.