Les informations d’identification réseau C # ne sont pas transmises au serveur?

Edit: Utiliser:

byte[] authBytes = System.Text.Encoding.UTF8.GetBytes(user + ":" + password); wr.Headers["Authorization"] = "Basic " + Convert.ToBase64Ssortingng(authBytes); 

Semble bien fonctionner.

J’ai une application qui communique avec un CMS. J’essaie actuellement de faire en sorte que ce client puisse télécharger des données texte / XML sur le CMS en utilisant une méthode “POST”.

Je peux passer cela parfaitement en utilisant curl:

 curl -u user:password -H "Content-Type:text/xml" -d "myXML" serverURL 

Cependant, en essayant d’utiliser HttpWebRequest en C #, je ne parviens pas à faire en sorte que le serveur retourne ce que je veux. J’ai donc lancé Wireshark et jeté un œil à ce qui était réellement passé, et c’est à peu près identique, sauf que lorsque j’utilise curl, je peux voir:

 Authorization: Basic =\r\n Credentials: user:password 

Dans les champs d’en-tête HTTP, alors que dans la sortie de mon client, ces champs d’en-tête ne sont tout simplement pas présents. (“Credentials:” n’existe pas en clair, il s’agit d’un sous-arbre de “Authorization:”. Je ne sais donc pas d’où il provient, mais le nom d’utilisateur et le mot de passe sont corrects.)

Le code C # que j’essaie d’utiliser pour définir les informations d’identification de la requête en ligne ressemble à ceci:

 NetworkCredential myCred = new NetworkCredential( user, password, serverURL); CredentialCache myCache = new CredentialCache(); myCache.Add(new Uri(serverURL), "Basic", myCred); HttpWebRequest wr = (HttpWebRequest) HttpWebRequest.Create(serverURL); wr.Credentials = myCache; 

J’ai aussi essayé de définir les informations d’identification comme ceci (et sans spécifier serverURL):

 wr.Credentials = new NetworkCredential(user,password,serverURL); 

Mais cela ne le fait toujours pas apparaître dans Wireshark. Est-ce que quelqu’un a une idée si:

A) que les informations d’autorisation doivent en fait figurer dans l’en-tête HTTP pour que cela fonctionne, et

B) Si c’est le cas, comment puis-je faire en sorte que C # le mette? Je semble seulement être capable de trouver des exemples décents en utilisant les informations d’identification par défaut, ce qui ne s’applique pas à ce que je fais.

Merci d’avance.

WebRequest .NET a un comportement par défaut exaspérant, selon lequel il envoie uniquement les informations d’identification après avoir reçu une réponse HTTP 401 non autorisée.

Ajouter manuellement l’en-tête des informations d’identification (comme vous l’avez fait) semble être la meilleure solution disponible.

Plus de détails dans ce post