Simple HttpWebRequest sur SSL (https) donne 404 Non Trouvé sous C#

Je veux faire un POST à un php-écrite Service Web qui se trouve sur une connexion sécurisée. Le code suivant est juste un test de la console app que j'ai écrit après quelques heures d'essais et d'erreurs. Essentiellement, j'ai trouvé quelques méthodes pour utiliser HttpWebRequest, mais ils sont tous de la même chose.

De tester mon URI par "http" sur un navigateur web, doit retourner un vide html (dont le corps est vide). Ceci fonctionne bien dans un navigateur et dans mon code.

Je suis allé de l'avant un a essayé http://www.google.com et j'ai eu de google... (comme prévu).
Le problème se pose lorsque je change l'URI de http à https.
Test de mon URI avec le "https" sur un navigateur web, retourne les mêmes html vide (c'est prévu).
Mais quand j'ai essayer la même URI dans le code, j'obtiens une erreur 404 not Found.

Voici le code simple (et l'URI) (décommenter la seconde pour essayer https):

try
{
  string lcUrl = "http://servicios.mensario.com/enviomasivo/apip/";
  //string lcUrl = "https://servicios.mensario.com/enviomasivo/apip/";

  //*** Establish the request
  HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);

  //*** Set properties
  loHttp.Timeout = 10000;     //10 secs
  loHttp.Method = "POST"; //I added this for testing, but using GET or commenting this out doesn't change anything.

  //Retrieve request info headers ******** HERE I GET THE EXCEPTION **********
  HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();

  //All this code only works when lcUrl is NOT https.
  Encoding enc = Encoding.GetEncoding(1252);  //Windows default Code Page

  StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc);

  string lcHtml = loResponseStream.ReadToEnd();

  loWebResponse.Close();
  loResponseStream.Close();
}
catch ( WebException ex )
{
  if ( ex.Status == WebExceptionStatus.ProtocolError )
  {
    HttpWebResponse response = ex.Response as HttpWebResponse;
    if ( response != null )
    {
      //Process response
      Console.WriteLine(ex.ToString());
    }
  }
}
Console.Read();
return;

L'exception est la suivante:

Système.Net.WebException: Le serveur distant a retourné une erreur: (404) Pas Trouvé. au
Système.Net.HttpWebRequest.GetResponse()

note: L'url http montré ici est le vrai celui que j'ai à utiliser, il ne m'appartient pas, mais à une autre société.

Si la réponse ont été OK, c'est ce que lcHtml doit contenir:

<html>
<head>
 <title></title>
</head>

<body>
</body>
</html>

Depuis que j'ai googlé et StackOverflowed un beaucoup avant de poster cette question, j'ai trouvé quelques idées. L'un est d'ajouter la "ignorer les certificats" code:

System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate( object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors )
  {
      return true; //**** Always accept
  };

Qui ne semble pas changer quoi que ce soit.

Autre utilisateur a dit que le Protocole SSL de Type peut-être mal... alors j'ai essayé avec ces deux en vain:

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Des idées?

Mise à JOUR
Je suis retourné et a créé une application console simple.
Le seulement code est: est-ce

WebRequest req = WebRequest.Create("http://servicios.mensario.com/enviomasivo/apip/");
WebResponse resp = req.GetResponse();

Qui fonctionne. Pas d'erreur.

Cependant, si je change l'URI de https:

WebRequest req = WebRequest.Create("https://servicios.mensario.com/enviomasivo/apip/");
WebResponse resp = req.GetResponse();

J'obtiens une erreur (aller de l'avant et essayer).

Cependant cette code php qui semble fonctionner. La seule pertinentes ligne de code que je vois est différente:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

Le commentaire, en espagnol dit: "Avec ça, on peut ignorer le SSL Cert".

Je pense que c'est la clé. Mais le

System.Net.ServicePointManager.ServerCertificateValidationCallback

...des trucs, ne semble pas avoir le même effet.

Merci d'avance.

+1 pour l'utilisation du terme "StackOverflowed" comme un verbe.
Hé hé hé, merci. 😉

OriginalL'auteur Martin Marconcini | 2009-04-20