2013-01-10 5 views
2

Ceci est ma première tentative de création d'un console app qui peut faire une demande HTTP GET et imprimer la réponse au . Jusqu'à présent, le code fonctionne, mais seulement pour URIs qui ne nécessite pas de code username/password.Demande HTTP GET avec nom d'utilisateur et mot de passe

Mon but ultime est d'utiliser un cloud/hosting API qui accepte les demandes HTTP GET comme déclenche pour prendre certaines mesures. En tant que tel, je dois utiliser un username/password pour cela.

using System; 
using System.Net; 
using System.IO; 

namespace HttpTestProject { 

    class Program { 

     static void Main(string[] args) { 

      Uri uri = new Uri("http://www.google.com"); 
      string username = "asdf"; 
      string password = "asdf"; 

      NetworkCredential cred = new NetworkCredential(username, password); 
      CredentialCache cache = new CredentialCache(); 
      cache.Add(uri, "Basic", cred); 

      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      Stream resStream = response.GetResponseStream(); 

      StreamReader reader = new StreamReader(resStream); 
      string text = reader.ReadToEnd(); 

      Console.WriteLine(text); 
      Console.ReadLine(); 

     } 

    } 

} 
+4

Si pas les informations d'identification réseau être envoyée en utilisant POST? – VladL

+1

@VladL L'authentification HTTP de base est indépendante de la méthode de requête. Je me demande quelle est la question (les informations d'identification ne doivent-elles pas être affectées à la propriété 'Credentials' de la requête?) –

+0

@VladL Envoyer des informations d'identification réseau via un GET au lieu d'un POST n'est pas moins sécurisé, n'est-ce pas? – nairware

Répondre

10

Si vous devez ajouter l'authentification de base à votre demande sans attendre un défi que vous pouvez ajouter manuellement l'en-tête:

var request = WebRequest.Create("http://myserver.com/service"); 
string authInfo = userName + ":" + userPassword; 
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 

//like this: 
request.Headers["Authorization"] = "Basic " + authInfo; 

var response = request.GetResponse(); 
+0

Je n'ai pas trouvé cela jusqu'à récemment, mais peut-être le code préféré comprend 'request.Credentials = new NetworkCredential (nom d'utilisateur, mot de passe);' J'utilisais ce code récemment pour autre chose, et un autre codeur m'a fait cette recommandation. Les deux approches fonctionnent pour moi. – nairware

+0

@nairware, AFAIK, si vous définissez 'Credentials', la requête sera envoyée sans eux, alors le client HTTP .NET attendra que la réponse soit un code HTTP 401 contenant un en-tête HTTP' WWW-Authenticate' (ce que je appelé défi). Ensuite, il va répéter la demande, y compris les informations d'identification. C'est la bonne manière selon le RFC, mais si le serveur ne fonctionne pas de cette façon, vous devez envoyer l'en-tête 'Authorization' à la main comme je l'ai suggéré. – istepaniuk

Questions connexes