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.
Hé hé hé, merci. 😉
OriginalL'auteur Martin Marconcini | 2009-04-20
Vous devez vous connecter pour publier un commentaire.
Après une période d'expérimentation à l'aide de fiddler et firefox, il semble que votre URL est le problème. Pour moi, cela donne une erreur 404:
https://servicios.mensario.com/enviomasivo/apip/
et ce n'est pas le cas:
https://servicios.mensario.com/enviomasivo/apip
Note, de la fin de la barre oblique. Aussi, le php échantillon que vous avez posté n'est pas la fin slash.
OriginalL'auteur Erv Walter
Vous pourriez essayer l'astuce décrite ici:
http://oregonstate.edu/~reeset/blog/archives/166
hmm trop mauvais, il n'a rien fait. Pensez-vous aussi à la 404 dans le site web du serveur de fichiers de log?
Je n'ai pas accès au serveur web de log 🙁 Ce n'est pas de mon serveur. Je pense que je dois être en train de faire quelque chose de mal ici... ne peut pas être bizarre.
OriginalL'auteur thijs
Ça ne ressemble pas à un problème avec le code, car l'URL que vous avez donné semble avoir un certificat SSL valide de toute façon.
Essayer vos deux lignes, extrait avec "https://www.google.com" travaille, alors je vous suggère de configuration d'un web debugging proxy comme un violon pour comparer la Requête HTTP champs lors de l'utilisation de HTTP et de HTTPS sur servicios.mensario.com/enviomasivo/apip. Êtes-vous à l'aide d'un reverse proxy sur ce site?
Salut, j'ai installé le Violoneux. Avec les "deux lignes" vs HTTPS (je suis l'exception), le résultat semble être ok, cependant fiddler a dit que c'est crypté. Si je decrypt (dans un violon), le résultat ne semble ok: HTTP/1.1 404 /enviomasivo/apip/ Set-Cookie: JSESSIONID=13B63930D2DBA0520FB602D8006B6C44; Path=/enviomasivo; Secure Content-Type: text/html;charset=ISO-8859-1 Date: tue, 21 Apr 2009 15:54:00 GMT Server: Apache-Coyote/1.1 Contenu-Longueur: 61 <html> <head> <title></title> </head> <body> </body> </html>
OriginalL'auteur Maxam