2009-04-21 6 views
11

Après avoir perdu deux jours avec this question (et d'essayer de le faire fonctionner), j'ai décidé de faire un pas en arrière et poser une question plus fondamentale, car apparemment il y a quelque chose que je ne sais pas ou je fais mal.affichage à l'aide POST de C# via https

Les exigences sont simples, Je dois faire un post HTTP (en passant quelques valeurs) sur https de C#.

Le site Web (si les valeurs appropriées sont indiquées) renverra un code HTML simple et un code de réponse. (Je vais montrer ces derniers plus tard).

Il est vraiment que simple. Le "webservice" fonctionne. J'ai un exemple de php qui fonctionne et se connecte avec succès. J'ai aussi une application "démo" Dephi (avec le code source) qui fonctionne également. Et enfin, j'ai l'application de démonstration (binaire) de la société qui a le "service", qui fonctionne aussi bien sûr.

Mais j'ai besoin de le faire en C#. Cela semble si simple, ça ne marche pas.

À des fins de test, j'ai créé une application de console simple et une méthode de connexion simple. J'ai essayé comme 7 différentes manières de créer une requête HTTP, à peu près la même chose, une implémentation différente (Using WebClient, using HttpWebRequest, etc).

Chaque méthode fonctionne, sauf lorsque l'URI commence par 'https'.

je reçois un WebException disant que le serveur distant a retourné 404. J'ai installé Fiddler (comme suggéré par un utilisateur SO), et objet d'une enquête un peu le trafic. Le 404 est parce que je passe quelque chose de mal, parce que, comme je l'ai mentionné plus tard, le «service» fonctionne. Je parlerai des résultats du violoneux plus tard.

L'URL où je dois POST les données: https://servicios.mensario.com/enviomasivo/apip/

Et voici les données POST: (les valeurs sont faux)

usuario = UnUtilisateur & clave = unMotdepasse & nserie = Version = 01010000 & operacion = 220

Le serveur peut renvoyer une réponse deux/trois lignes (désolé pour l'espagnol, mais la société vient d'Espagne). Voici un exemple d'une réponse possible:

HTTP/1.1 200 OK 
Content-Type: text/plain 

01010000 100 BIEN 
998 

Et voici une autre

HTTP/1.1 200 OK 
Content-Type: text/plain 

01010000 20 AUTENTIFICACION NEGATIVA 
Ha habido un problema en la identificación ante el servidor. Corrija sus datos de autentificacion. 

Le 1er signifie un OK, et le 2ème est Auth échec.

Comme vous pouvez le voir la tâche est assez facile, seulement cela ne fonctionne pas. Si j'utilise fiddler, je vois qu'il y a une sorte de SSL qui se passe dans la connexion et tout fonctionne bien. Cependant, pour autant que j'ai lu, .NET gère tout cela pour nous (oui, j'ai ajouté le rappel pour toujours valider les certificats invalides). Je ne comprends pas ce que je fais mal.Je peux poster/envoyer le code, mais ce que je voudrais savoir est très simple:

Comment pouvez-vous faire un POST sur SSL en utilisant C# et un "simple" HttpWebRequest et plus tard avoir la réponse dans une chaîne/array/Quel que soit le traitement?

Croyez-moi quand je dis que j'ai été googling et Stackoverflowing pendant deux jours. Je n'ai aucune sorte de proxy. La connexion passe par mon routeur. Ports standards Rien d'extraordinaire. Mon ordinateur se trouve dans une machine virtuelle VMWare et est Windows Vista, mais étant donné que les exemples d'applications (php, Delphi, binaire) fonctionnent sans problème, je ne vois pas cela comme un problème).

Les différents échantillons (sans le binaire) sont disponibles here si quelqu'un veut y jeter un coup d'œil.

J'apprécierais toute aide. Si quelqu'un veut essayer avec un "vrai" nom d'utilisateur, j'ai un utilisateur de démonstration et je pourrais vous passer l'utilisateur/passer à des fins de test. J'ai seulement un utilisateur démo (celui qu'ils m'ont donné) et c'est pourquoi je ne colle pas ici. Je ne veux pas inonder l'utilisateur avec des tests;)

J'ai essayé (dans les exemples) en utilisant UTF8 et ASCII, mais cela n'a rien changé.

Je suis 100% certain qu'il y a quelque chose que je dois faire avec SSL et je ne le fais pas parce que je ne le sais pas.

Merci dans avance.

Martín.

Répondre

5

voir ma réponse à votre autre question. Je crois que votre problème n'est peut-être pas votre code C#. L'URL du service Web renvoie un 404 avec plusieurs autres outils que j'ai utilisés, mais il renvoie la réponse que vous avez indiquée si vous laissez la barre oblique à partir de l'URL du service Web, alors je suggère d'essayer cela.

Bizarrement, cela ne semble pas important si l'URL de fin est là quand on ne fait pas de SSL. Quelque chose d'étrange avec ce serveur web, je suppose.

+0

Erv, c'était tout! Merci beaucoup. (Et grâce aux autres affiches pour les échantillons, je vais sûrement utiliser un mélange de tout cela.Vous êtes mon héros, comme je l'ai dit dans l'autre question. :) –

+1

Moral De l'histoire: Toujours tripple vérifier quoi " d'autres développeurs "vous le diront. (Le programmeur du serveur web a insisté sur le fait que l'URL avait le slash, et je l'ai cru). : S –

8

Je me battais avec le même problème un peu plus tôt (bien que dans un cadre compact). Voici ma question et ma propre réponse: Asynchronous WebRequest with POST-parameters in .NET Compact Framework

Ma version est asynchrone, donc c'est un peu plus complexe que ce que vous cherchez, mais l'idée reste.

private string sendRequest(string url, string method, string postdata) { 
    WebRequest rqst = HttpWebRequest.Create(url); 

    // only needed, if you use HTTP AUTH 
    //CredentialCache creds = new CredentialCache(); 
    //creds.Add(new Uri(url), "Basic", new NetworkCredential(this.Uname, this.Pwd)); 
    //rqst.Credentials = creds; 
    rqst.Method = method; 
    if (!String.IsNullOrEmpty(postdata)) { 
     //rqst.ContentType = "application/xml"; 
     rqst.ContentType = "application/x-www-form-urlencoded"; 

     byte[] byteData = UTF8Encoding.UTF8.GetBytes(postdata); 
     rqst.ContentLength = byteData.Length; 
     using (Stream postStream = rqst.GetRequestStream()) { 
      postStream.Write(byteData, 0, byteData.Length); 
      postStream.Close(); 
     } 
    } 
    ((HttpWebRequest)rqst).KeepAlive = false; 
    StreamReader rsps = new StreamReader(rqst.GetResponse().GetResponseStream()); 
    string strRsps = rsps.ReadToEnd(); 
    return strRsps; 

} 
+0

Salut Tommi, merci pour l'échantillon. Malheureusement, cela ne semble pas fonctionner pour moi non plus. Il ya deux fautes de frappe dans votre code (vous utilisez 'req' quand vous créez le StreamReader et je pense que c'est rqst? Et puis le streamIn je pense que c'est rsps (près de la fin). Malgré cela, je reçois toujours un 404 dans cette ligne: StreamReader rsps = new StreamReader (req.GetResponse(). GetResponseStream()); Question: Si je ne veux pas utiliser les informations d'identification, est-ce que je peux l'ignorer? Je l'ai fait mais ça n'a pas marché. Ce service ne répond pas. user/pass –

+1

Geez, désolé pour les fautes de frappe. Je vais les réparer dans la réponse tout de suite. Si c'est 404 que vous obtenez, alors le problème n'est pas dans le code, vous envoyez juste la mauvaise URL. Mettez des points d'arrêt dans le code qui envoie la requête et double-vérifiez que l'URL que vous fournissez au constructeur Uri est valide. Et oui, bien sûr, vous pouvez passer la partie Credentials, je vais commenter! –

+0

Oh, et aussi, j'ai besoin de changer le type de contenu à "application/x-www-form-urlencoded" que vous envoyez des paramètres POST réguliers. Dans mon cas, j'envoyais du XML dans le domaine des paramètres post et il a mandaté ce type de contenu. –

0

Je ne sais pas si vous avez déjà résolu ce problème, il s'agit d'un article publié il y a un an. Je suis espagnol et j'utilise mensario aussi.

pour envoyer et demande http: (ce qui est en ASP, mais le processus est le même)

Function enviarMsg2 
    Dim oHTTP,inicio 
    Dim strParametros 
    Dim devolver 

    Set oHTTP= server.CreateObject("Msxml2.ServerXMLHTTP") 
    strParametros = "usuario="&usuario&"&clave="&clave&"&nserie="&nserie&"&  version=01010000&operacion=300&sms=1%0934635035526%0920041231233000%09Clinica+Paz%09Clinica+Paz+le+desea+Feliz+Navidad%2E&sms=2%0934612345678%0920041231233001%09Clinica+Paz%09Clinica+Paz+le+desea+Feliz+Navidad%2E" 
'response.Write strParametros 
'response.End 
'Abrimos la conexión con el método POST, ya que estamos enviando una petición. 
oHTTP.open "POST", "https://servicios.mensario.com/enviomasivo/apip", False 

'Agregamos encabezados HTTP requeridos... 
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 

'Enviamos la petición 
oHTTP.send strParametros 
devolver = oHTTP.responsetext 

'Comprobamos si fue correcto   
inicio = Instr(devolver, "100 BIEN") 
'response.Write "--->"&inicio 
'response.End  
if inicio <=0 then 
    enviarSMS2 = "Ha ocurrido un error en el envío del SMS." 
else 
    enviarSMS2 = Mid(devolver,inicio+9,len(devolver)) 
end if 

Set oHTTP = Nothing 

La seule chose que je n'avez pas est un utilisateur/mot de passe pour essayer :)

Basicaly, lorsque la réponse est "100 bien" la fonction renvoie cela, sinon il renvoie erreur.Espérons que ça aide :)

+0

Merci pour la réponse Jorge, nous avons déjà résolu le problème. Le problème était que le mensario url avait un "/" à la fin, ce qui était incorrect. –