2009-04-02 5 views
9

J'essaie actuellement d'obtenir une réponse d'un serveur qui utilise SSL en C#. J'ai le code pour le faire en Java, mais il semble qu'ils ne traduisent pas 1: 1.Comment utiliser la requête HTTP GET en C# avec SSL? (violation de protocole)

J'ai un code que j'ai trouvé qui fonctionne pour les pages normales, mais pas pour celui dont j'ai besoin (peut-être à cause de la chose SSL). Voici le code:

 WebRequest request = WebRequest.Create("https://" + sslServerHost + ":" + sslServerPort); 
    request.Proxy = null; 
    request.Credentials = CredentialCache.DefaultCredentials; 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    Stream dataStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(dataStream); 
    string responseFromServer = reader.ReadToEnd(); 

MISE À JOUR: Désolé, j'ai l'impression d'avoir oublié l'erreur. J'obtiens une exception de violation de protocole à la ligne "HttpWebResponse response = (HttpWebResponse) request.GetResponse();" Des idées? Merci les gars.

+0

Ambre: Pouvez-vous décrire ce qui ne va pas? Est-ce que ça ne donne pas de résultats? Avez-vous une sorte d'exception? Si oui, quel genre d'exception, et quel est le message? – JMarsch

+1

Pourrait potentiellement être un problème de certificat non approuvé? – Dscoduc

Répondre

2

Juste une idée, mais avez-vous essayé avec un "/" final? Aussi - vous pourriez trouver cette approche plus facile:

string s; 
using(WebClient client = new WebClient()) { 
    client.UseDefaultCredentials = true; 
    s = client.DownloadString("https://" + sslServerHost + ":" 
     + sslServerPort + "/"); 
} 
+0

Merci pour la suggestion, mais pas de dés. –

14

Les conversations HTTP sur SSL utilisent un certificat correctement émis pour la validation.

Vous pouvez utiliser le délégué RemoteCertificateValidationCallback pour la validation du certificat SSL comme suit:

public static void ConnectSSL() 
{ 

    WebRequest request = WebRequest.Create("https://" + sslServerHost + ":" + sslServerPort); 
    request.Proxy = null; 
    request.Credentials = CredentialCache.DefaultCredentials; 

    //allows for validation of SSL certificates 

    ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate); 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    Stream dataStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(dataStream); 
    string responseFromServer = reader.ReadToEnd(); 

} 

//for testing purpose only, accept any dodgy certificate... 
public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
      return true; 
} 
+0

assurez-vous de disposer de HttpWebResponse correctement, ou au moins appelez Close() dans un bloc finally! –

1

Voici un code de test que j'ai utilisé avec succès pour tester les connexions SSL ...

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.dscoduc.com"); 
//request.Method = "HEAD"; 
//request.AllowAutoRedirect = false; 
request.Credentials = CredentialCache.DefaultCredentials; 

// Ignore Certificate validation failures (aka untrusted certificate + certificate chains) 
ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream resStream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(resStream); 
string responseFromServer = reader.ReadToEnd(); 
Questions connexes