J'ai un problème avec l'envoi d'une requête POST de C# à un script PHP sur mon serveur Apache (Windows). Tout fonctionne correctement, sauf si j'ordonne à Apache d'exiger un utilisateur valide utilisant l'authentification BASIC via un fichier .htaccess
.C#: requête POST avec l'authentification BASIC mélange QUERY_STRING et REQUEST_METHOD en PHP?
Mais mettons les choses en ordre. J'utilise le code suivant pour envoyer une liste de paires clé/valeur à mon script PHP en utilisant HTTP POST:
NameValueCollection nameValues = new NameValueCollection();
nameValues["operation"] = ...;
nameValues["order"] = ...;
nameValues["status"] = ...;
nameValues["comment"] = ...;
nameValues["user"] = ...;
WebClient webClient = new WebClient();
try
{
CredentialCache credentialCache = new CredentialCache();
credentialCache.Add(new Uri(PERFORM_URL), "Basic", new NetworkCredential(PERFORM_USER, PERFORM_PASSWORD));
webClient.Credentials = credentialCache;
byte[] response = webClient.UploadValues(PERFORM_URL, "POST", nameValues);
string responseString = Encoding.ASCII.GetString(response);
}
finally
{
webClient.Dispose();
}
Le script PHP sur le serveur ressemble à ceci:
<?php
print_r($_SERVER);
?>
Alors Je viens de sortir quelques informations d'en-tête ici. Je désactive l'authentification de base dans mon fichier htaccess
, tout va bien. Quand je l'allume, cependant, je reçois la sortie suivante:
Array
(
...
[REMOTE_USER] => ****
[AUTH_TYPE] => Basic
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => operation=updatestatus&order=185&status=17&comment=Test&user=somenamePOST
[QUERY_STRING] =>
...
[PHP_AUTH_USER] => ****
[PHP_AUTH_PW] => ****
[REQUEST_TIME] => 1286889387
[argv] => Array
(
)
[argc] => 0
)
Où, la REQUEST_METHOD
contient tous les paramètres + l'annexe POST
. C'est faux. Que puis-je faire à ce sujet? J'ai également lu et essayé des solutions, où les gens ont utilisé HttpWebRequest
en utilisant la propriété PreAuthenticate
- mais cela n'a pas fonctionné pour moi non plus.
Quelle est la réponse réelle sur le fil? Sachant que cela aiderait à savoir si le bug était dans la partie C# ou dans la partie PHP. –
Mon code C# reçoit la sortie que j'ai donnée dans le dernier fragment de code. Je n'ai pas débogué la communication HTTP réelle - comment ferais-je cela? Qu'est-ce que tu veux voir? –
La meilleure chose à faire serait probablement de faire passer Wireshark sur le réseau entre eux, et regarder le trafic TCP brut pour voir si c'est même HTTP valide que C# envoie ... Sinon, vous savez au moins qu'il est en C# (soit votre code, soit un bogue dans la bibliothèque que vous utilisez) ... – ircmaxell