Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1548 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] HttpWebRequest et adresse d'hôte avec majuscule

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] HttpWebRequest et adresse d'hôte avec majuscule

n°2248583
DiB91
Bwaaaaaaah
Posté le 16-01-2015 à 12:32:49  profilanswer
 

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 :o
 
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


---------------
Rehost gratuit et anonyme fait maison
mood
Publicité
Posté le 16-01-2015 à 12:32:49  profilanswer
 

n°2248584
DiB91
Bwaaaaaaah
Posté le 16-01-2015 à 12:33:21  profilanswer
 

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.


Message édité par DiB91 le 17-01-2015 à 12:57:44

---------------
Rehost gratuit et anonyme fait maison
n°2248602
TotalRecal​l
Posté le 16-01-2015 à 17:12:32  profilanswer
 

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...


Message édité par TotalRecall le 16-01-2015 à 17:14:23

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2248608
DiB91
Bwaaaaaaah
Posté le 16-01-2015 à 17:46:38  profilanswer
 

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 :
  1. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(WebServiceEndpointURL);


 
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 ;)


---------------
Rehost gratuit et anonyme fait maison
n°2248609
TotalRecal​l
Posté le 16-01-2015 à 17:55:22  profilanswer
 

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 :fouyaya:. Je crois que si tu n'as pas d'autre idée que ma suggestion il vaut mieux attendre le retour du presta :lol:

 

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:
    Converts the URI scheme to lowercase.
   Converts the host name to lowercase.


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.


Message édité par TotalRecall le 16-01-2015 à 18:16:04

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2248644
DiB91
Bwaaaaaaah
Posté le 17-01-2015 à 12:52:54  profilanswer
 

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 :D
 
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 ;)


---------------
Rehost gratuit et anonyme fait maison

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] HttpWebRequest et adresse d'hôte avec majuscule

 

Sujets relatifs
C# System.InvalidOperationExceptionC++ builder 6 et l'aide sur windows seven
C: probleme de compil sur un typede => ferror: syntax error before ''Commande Oracle PROMPT / ACCEPT dans une appli console C#
Probleme avec FMODex en C pour lecture de .wav/.mp3Structuration de programme en C#
Compteur population mondiale en C (en fonction du temps)[C#][Windows Form] "Form" toujours au dessus d'un autre
exercice C ( debutant) demande d explicationsProblème code C++ débutant watershed
Plus de sujets relatifs à : [C#] HttpWebRequest et adresse d'hôte avec majuscule


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR