2010-10-12 13 views
0

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.

+0

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

+0

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? –

+0

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

Répondre

0

Hm. Je ne l'ai pas fait fonctionner, mais mis en œuvre par une authentification propre, donc je n'ai plus besoin de l'authentification de base. Serait toujours intéressé par une solution de travail, au cas où quelqu'un aurait une idée ;-)