J'ai un serveur HTTP qui renvoie des corps volumineux en réponse à des requêtes POST (c'est un serveur SOAP). Ces corps sont "streamés" par segmentation. Si je rencontre une erreur au milieu de la diffusion de la réponse, comment puis-je signaler cette erreur au client tout en maintenant la connexion ouverte? L'implémentation utilise une pile HTTP/SOAP propriétaire, donc je suis intéressé par les réponses au niveau du protocole HTTP.Comment signaler une erreur à mi-chemin d'une réponse http fragmentée sans fermer la connexion?
Répondre
Une fois que le serveur a envoyé la ligne d'état (la toute première ligne de la réponse) au client, vous ne pouvez plus modifier le code d'état de la réponse. De nombreux serveurs retardent l'envoi de la réponse en la tamponnant en interne jusqu'à ce que le tampon soit plein. Pendant que le tampon se remplit, vous pouvez toujours changer d'avis sur la réponse.
Si votre client a accès aux en-têtes de réponse, vous pouvez utiliser le fait que l'encodage en segments permet au serveur d'ajouter une bande-annonce avec des en-têtes après le corps codé en segments. Ainsi, votre serveur, ayant rencontré l'erreur, pourrait gracieusement arrêter d'envoyer le corps, puis envoyer une bande-annonce qui définit un en-tête à une certaine valeur. Votre client interpréterait alors la présence de cet en-tête comme un signe qu'une erreur s'est produite.
J'espérais qu'il y avait une convention pour négocier la livraison d'un statut «alternatif». Par exemple. en l'enfonçant dans une extension finale de bloc de taille zéro (après 0, avant \ r \ n \ r \ n). –
Oui, cette idée m'est également venue à l'esprit (mais seulement après mon article original). Voir le deuxième paragraphe que j'ai ajouté. – Alexander
vous pouvez modifier le code d'état tant que response.iscommitted() renvoie la valeur false. (pour HttpServletResponse dans java, je suis sûr qu'il existe un équivalent dans d'autres langages)
Gardez également à l'esprit que les réponses en blocs peuvent contenir "footers" qui sont exactement comme les en-têtes HTTP. Après avoir échoué, vous pouvez envoyer un pied de page tels que:
X-RealStatus: 500 Some bad stuff happened
Ou si vous réussissez:
X-RealStatus: 200 OK
- 1. Comment puis-je signaler une erreur à mi-chemin d'une réponse http chunked si je souhaite fermer la connexion?
- 2. Comment fermer une connexion NHibernate?
- 3. Modifier la réponse Http
- 4. À quoi ressemble la mémoire fragmentée?
- 5. Comment fermer une application C# sans formulaire
- 6. Décomposition de la réponse HTTP
- 7. Connexion d'un modèle de requête/réponse http à une file d'attente asynchrone
- 8. Erreur Http 503 dans la connexion de servlet
- 9. Obtenir une réponse d'erreur xml HTTP à l'aide cURL
- 10. Quelles sont les conséquences de ne pas fermer la connexion à la base de données après une erreur?
- 11. Réponse HTTP Question
- 12. Retour XML comme réponse HTTP
- 13. Comment produire une réponse 303 Http dans Django?
- 14. Rails: Comment obtenir la réponse des serveurs en-têtes HTTP?
- 15. Maintenir une connexion http active en C#?
- 16. Comment obtenir la réponse?
- 17. Comment configurer une connexion HTTP dans une classe spéciale?
- 18. Annulation d'une connexion d'authentification HTTP?
- 19. SSL sans HTTP
- 20. Comment convertir une réponse Net :: HTTP à un certain codage dans Ruby 1.9.1?
- 21. Erreur lors de la connexion à distance
- 22. Forcer la connexion pour fermer avec HttpClient dans WCF
- 23. Comment obtenir Fiddler pour signaler les connexions HTTP sur un PC local
- 24. Erreur de serveur: Le serveur a fermé la connexion en lisant la réponse
- 25. IE7 Erreur HTTP 400
- 26. jquery ajax erreur réponse JSON
- 27. Connexion HTTP Android
- 28. Comment trouver un appel sans réponse iphone
- 29. envoyer une erreur de requête HTTP (Http 503) en C#
- 30. Un ActionResult personnalisé pour une réponse http en plusieurs parties?
Mark, j'ai fait une mise à jour à mon poste d'origine. Mais, je ne sais pas si vous le remarquerez puisque vous avez déjà marqué la réponse comme acceptée. Ce commentaire est là pour attirer votre attention en apparaissant dans l'onglet Réponses de votre compte ... – Alexander