HttpWebRequest et adresse d'hôte avec majuscule [C#] - C#/.NET managed - Programmation
Marsh Posté le 16-01-2015 à 12:33:21
Solution :
Pour cette problématique, il n'existe pas vraiment de solution miracle puisque le standard (http://tools.ietf.org/html/rfc4343, http://tools.ietf.org/html/rfc3986) impose qu'un nom de domaine soit insensible à la casse. C'est pourquoi le Framework .NET, via sa classe Uri, "prend la liberté" de convertir automatiquement les host names en minuscules.
Ici, c'est donc côté presta (serveur que auquel je post mes datas) de faire la modif de leur infra, afin que l'URL à contacter soit en minuscule.
Marsh Posté le 16-01-2015 à 17:12:32
Un petit peu de code ?
Tu as pu voir si c'est l'objet HttpWebRequest (que tu initialises avec un WebRequest.Create j'imagine) qui fait ça, ou l'objet Uri (utilisé en interne même en passant une chaîne) ?
Pourquoi tu n'utilises pas WCF (ou autre !) plutôt qu'un dév spé pour faire du SOAP ? Ca ressemble à réinventer la roue.
Dans tous les cas ne pas respecter les standards c'est jamais bien, tu peux insulter ton prestataire.
Et sinon "soap 4.0" ça n'existe pas. Vers 2030 peut être au rythme où la norme évolue...
Marsh Posté le 16-01-2015 à 17:46:38
Déjà, merci pour ta réponse..
Je me suis mal exprimé, en effet, le 4.0 s'applique au SOAP Header. Après, c'est peut-être une nomenclature imposée par le presta...
Côté code, je n'ai pour le moment rien partagé parce que je voulais être sûr que mon soucis en était bien un... et que, comme toi, je ne suis pas sûr que par la suite (mon code pour le moment tient plus du POC voire du proto que de la dll finale exploitée par les applis) l'envoi SOAP soit le plus judicieux...
Après, c'est le format que m'impose le presta (tout comme son algo de cryptage de password digne de la NASA... et qui n'a jamais réussi à reproduire les exemples donnés...)
Sinon, pour en revenir à ma WebRequest, oui, je te confirme que l'URI (propriété Address) est bien lui aussi affublé de la lettre minuscule (donc automatiquement changé après l'assignation) :
Code :
|
WebServiceEndpointURL = "https://nodeD1.production.[...]"
webRequest.Address = https://noded1.production.[...]
(même topo que pour le Host en fait).
J'ai contacté le presta, réponse lundi
Marsh Posté le 16-01-2015 à 17:55:22
Pour le code il ne m'en fallait pas plus que ce que tu donnes, ça confirme que c'est bien ce que j'avais compris.
Tu l'auras deviné toi même, je pense que ce comportement de la classe Uri est tout à fait explicable vu que la norme impose de travailler en lowercase car le Host est sensé ne pas être case sensitive.
Et vu que c'est un objet super bas niveau ça s'annonce délicat à contourner si ça n'a pas été prévu.
Pour le fun tu peux tenter de surcharger toute la classe Uri (attention c'est une usine à gaz) si elle n'est pas "sealed", pour permettre son instanciation en préservant la casse original et passer ton type surchargé à la signature de WebRequest.Create qui prend en paramètre une instance d'URI.
Si le lowercase n'est appliqué que là ça peut marcher, mais s'il est à nouveau forcé plus loin (dans WebRequest par exemple) ça ne marchera pas. Idem si la classe n'est pas surchargeable.
edit : je viens d'ouvrir Uri avec dotPeek, c'est encore pire que dans mon souvenir . Je crois que si tu n'as pas d'autre idée que ma suggestion il vaut mieux attendre le retour du presta
re-edit :
La MSDN ( http://msdn.microsoft.com/en-us/li [...] 10%29.aspx ) dit ceci :
Citation : The Uri properties return a canonical data representation in escaped encoding, with all characters with Unicode values greater than 127 replaced with their hexadecimal equivalents. To put the URI in canonical form, the Uri constructor performs the following steps: |
J'ai regardé un peu mais à mon avis sans grosse bidouille c'est cuit.
http://tools.ietf.org/html/rfc3986 , cf partie 3.2.2 (Host) : sérieux, demande à ton prestataire de corriger, c'est pas à toi de faire marcher leur bousin.
Marsh Posté le 17-01-2015 à 12:52:54
Effectivement TotalRecall, c'est exactement ce que je pensais, c'est le setter de la propriété qui convertit la chaine de caractères.
J'ai envoyé exactement le même lien (celui de la RFC qui détaille le standard pour nommer les noms de domaine...) avec mon dernier mail.
En réponse, le technicien en face m'a assuré qu'ils allaient apporter les modifications nécessaires.
En fait, ils se serviraient du check sur la casse uniquement à des fins de sécurisation... en comparant l'URL de post, et l'URL de la SOAPAction... Pour cette dernière, comme il s'agit d'un en-tête de ma requête SOAP libre, il n'y a pas de modification automatique... donc le "D1" est bien envoyé au serveur.
... et en effet, hier soir, juste avant de m'éclipser pour le week-end, j'ai pu poster une requête (donc Host avec noded1) où j'ai volontairement envoyé "noded1" dans la SOAPAction... et miracle, j'ai pu atteindre le serveur !
Bon, j'ai toujours une erreur parce que derrière, leurs algos de sécurisation me rejettent, mais j'ai pu recevoir une réponse
Merci pour ton aide en tout cas et du temps que tu as passé à m'éclairer
Chose promise, chose due, tu trouveras ton gift link pour le Weekly Humble Bundle 1$ dans tes MP d'ici 5 minutes
Marsh Posté le 16-01-2015 à 12:32:49
Hello HFR
Aujourd'hui, petite colle technique qui me bloque actuellement au taf.
Celui qui me trouve la réponse d'ici la fin du mois, gagne un HumbleBundle complet
Je bosse actuellement sur une appli .NET qui envoie des requêtes SOAP 4.0 vers le serveur d'un partenaire.
Comme j'ai toujours eu l'habitude de faire pour ce genre de problématique, je suis parti sur un objet framework HttpWebRequest, que je configure aux petits oignons et que j'envoie de manière asynchrone.
Le soucis, c'est que dans le cas présent, l'URL où je dois faire le POST de mes datas comporte une lettre majuscule, et que le setter de la propriété Host de mon objet HttpWebRequest semble imposer un ToLower() sur la chaîne de caractère que je lui assigne... Du coup, le nom de domaine, même si je le configure correctement, part avec une minuscule.
NB : je parle bien ici de l'URL de post de ma requête, pas de la SOAPAction, qui elle est OK.
Je sais bien que le standard impose qu'un nom de domaine soit case insensitive, mais le prestataire semble bloquer les requête entrantes comportant une minuscule...
Je lui ai gentiment copié/collé les articles en question, mais dans le cas où il refuserait d'assouplir ses scripts de son côté, connaissez-vous une façon de contourner cette limitation, qui me permettrait à moi, d'envoyer une web request avec un Host personnalisé ?
Le projet est maintenant bien avancé, donc il ne m'est pas envisageable de partir sur une alternative de bas niveau que j'écrirais moi-même... mais si il existe un autre objet du framework, je suis preneur, bien sûr
Merci d'avance!
Damien
---------------
La DiBerie | Rehost | Link