IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Méthode permettant d'envoyer des SMS - problème de retour


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Méthode permettant d'envoyer des SMS - problème de retour
    Bonjour à tous!
    J'aimerais trouver et réparer le problème qui fait que ma méthode renvoie un tableau de valeur null alors qu'elle devrait renvoyer des valeurs précises(permettant de certifier l'envoi du sms) Ce n'est pas moi qui ait rédigé et commenté le code à l'origine, du coup certains passages me semblent un peu flous.
    Notamment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] dataToPost = new ASCIIEncoding().GetBytes( strData.ToString() );
    => N'est-il pas bizarre de donner à datapost[] une valeur de bytes de zéro?(puisque strData a une length de zéro?) Sachant que l'on donne plus tard cette valeur à la longueur de la requête cela me parait étrange.

    J'ignore si c'est important mais les valeurs de myStream.Length, myStream.Position, responseStream.Length, responseStream.Position, streamReader.Length et streamReader.Position sont "
    ((System.Net.ConnectStream)myStream).Position' a levé une exception de type 'System.NotSupportedException'
    A la fin, result a pour valeur :
    "0: Accepted for delivery "
    Normalement le traitement qu'on affiche aux différentes lignes de Result[] est censé nous rendre Results[0].Trim() = "100" ou = "101" (ce qui signifie respectivement que le sms a bien été envoyé ou sera envoyé en différé)
    Or ici, il me semble qu'il ne fait pas du tout ça. En fait il passe au catch dès qu'il arrive sur la première ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Results[0] = result.Remove( result.IndexOf( "StatusText" ), result.Length - result.IndexOf( "StatusText" ) ).Substring( result.IndexOf( "Status" ) + 7 );
    car cette exception est levée :
    + [System.ArgumentOutOfRangeException] {"StartIndex ne peut pas être inférieur à zéro.\r\nNom du paramètre*: startIndex"} System.ArgumentOutOfRangeException
    La ligne de code rend un startindex(de la fonction remove je crois) négatif.
    C'est donc pourquoi il renvoie un Results null.(Results a été instancié comme ça dès sa création)

    Je viens ici par derniers recours mais en essayant d'expliquer la situation je me rend compte que sans avoir le programme sous le nez et en connaissant toute la situation vous aurez surement du mal à m'aider..

    A vrai dire je ne comprend pas les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Results[0] = result.Remove( result.IndexOf( "StatusText" ), result.Length - result.IndexOf( "StatusText" ) ).Substring( result.IndexOf( "Status" ) + 7 );
    					Results[1] = result.Remove( result.IndexOf( "Credits" ), result.Length - result.IndexOf( "Credits" ) ).Substring( result.IndexOf( "StatusText" ) + 11 );
    					Results[2] = result.Remove( result.IndexOf( "UnvalidNums" ), result.Length - result.IndexOf( "UnvalidNums" ) ).Substring( result.IndexOf( "Credits" ) + 8 );
    					Results[3] = result.Substring( result.IndexOf( "UnvalidNums" ) + 1 );
    D'ou sortent ces StatusText, Credits et UnvalidNums??

    Voilà le code de la méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    public string[] SendSMS ( string[] numerosTelephone, string Message )
    		{
    			Results = new string[4];
    			//Le flux XMl à envoyer au serveur SMS
    			flux_xml = "<DATA><CLIENT>" + LoginSMS + "</CLIENT><MESSAGE>" + Message
    						+ "</MESSAGE><CAMPAIGN_NAME>AUDI Sterling Occasion</CAMPAIGN_NAME><DATE></DATE><MSGCLASS>1</MSGCLASS><MAIL_NOTIF></MAIL_NOTIF>"
    						+ ListeNumeroTelephone( numerosTelephone );
    			String SocietyName = "";
    			try{
    				SocietyName = BusParametre.GetInstance().getTableSociete().Rows[0]["NOM_SOCIETE"].ToString();
    			}catch(Exception){
    				SocietyName = "inconnue";
    			}
     
    			int CreditSMS = -1;
    			try{
    				CreditSMS = BusParametre.GetInstance().GetCreditSMS();
    			}catch(Exception){
    				CreditSMS = -1;
    			}
     
    			//les donnees a poster au serveur
    			StringBuilder strData = new StringBuilder();
     
     
    			//On transforme le tout en tableau de byte
    			byte[] dataToPost = new ASCIIEncoding().GetBytes( strData.ToString() );
     
    			// On cree la requete Http
    			HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create( ServeurSMS + "clientcode=" + LoginSMS + "&passcode=" + PasswordSMS
    			+ "&societe=" + SocietyName + "&creditSMS=" + CreditSMS + "&XMLFlow=" + flux_xml);
                System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();
     
    			//ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(ValidateRemoteCertificate);
     
     
    			//Serveur PROXY
    			if( Proxy == "True" )
    			{
    				WebProxy myProxy = new WebProxy();
     
    				// Obtain the 'Proxy' of the  Default browser.
    				myProxy = (WebProxy)myRequest.Proxy;
    				try
    				{
    					string proxyAddress = ServeurProxy;
     
    					if( proxyAddress.Length > 0 )
    					{
    						string username = LoginProxy;
    						string password = PasswordProxy;
     
    						// Create a new Uri object.
    						Uri newUri = new Uri(proxyAddress); //15/01/13 paramètre false retiré
     
    						// Associate the newUri object to 'myProxy' object so that new myProxy settings can be set.
    						myProxy.Address = newUri;
     
    						// Create a NetworkCredential object and associate it with the Proxy property of request object.
    						myProxy.Credentials = new NetworkCredential(username,password);
    						myRequest.Proxy = myProxy;
    					}
    				}catch( Exception Except )
    				{
    					//Gerer l'execption du proxy
    					throw( Except );
    				}
    			}
    			//On specifie la commande a utiliser dans notre cas POST
    			// Envoi de donnes au programme situ  l'URL spcifie
    			myRequest.Method = "POST";
     
    			//Le type de contenu du corps de la requte
    			myRequest.ContentType="application/x-www-form-urlencoded";
     
    			//Longueur du corps de la requte
    			myRequest.ContentLength = dataToPost.Length;
     
    			//On ecris les donnee dans la requete
    			Stream myStream = myRequest.GetRequestStream();
     
    			// Envoie des donnees
    			myStream.Write(dataToPost,0,dataToPost.Length);
    			myStream.Close();
     
    			//On recupere la reponse
    			WebResponse myResponse = myRequest.GetResponse();
     
    			//on cree un flux
    			Stream responseStream = myResponse.GetResponseStream();
     
    			//On instancie un objet de type streamreader
    			StreamReader streamReader = new StreamReader(responseStream);
     
    			//On lit la totalite du flux
    			string result = streamReader.ReadToEnd().Replace("\n", "").Replace("\r", "");
     
    			//on ferme les flux
    			streamReader.Close();
    			responseStream.Close();
    			myResponse.Close();
    			myStream.Close();
     
    			try
    			{
    				if( result  != null && result != "" )
    				{
    					Results[0] = result.Remove( result.IndexOf( "StatusText" ), result.Length - result.IndexOf( "StatusText" ) ).Substring( result.IndexOf( "Status" ) + 7 );
    					Results[1] = result.Remove( result.IndexOf( "Credits" ), result.Length - result.IndexOf( "Credits" ) ).Substring( result.IndexOf( "StatusText" ) + 11 );
    					Results[2] = result.Remove( result.IndexOf( "UnvalidNums" ), result.Length - result.IndexOf( "UnvalidNums" ) ).Substring( result.IndexOf( "Credits" ) + 8 );
    					Results[3] = result.Substring( result.IndexOf( "UnvalidNums" ) + 1 );
    					if( Results[0].Trim() != "100" && Results[0].Trim() != "101" )
    					{
    						new fr.id2Software.podologie.business.CustomException ( Results[1] );
    					}
    				}else
    				{
    					Results = null;
    				}
    			}catch(Exception e)
                { throw (e); }
    			return( Results );
    		}
    Merci aux courageux qui voudront bien m'aider car je me rend bien compte que je ne suis pas très clair, pourtant je m'efforce de l'être

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bon d'après ce que j'ai pu comprendre, le problème doit se trouver au niveau de la configuration des messages de retour faîte par le serveur Kannel ou par le modem... Si quelqu'un s'y connait j'accepte toutes les réponses^^ mais je crains que ce sujet n'ait plus vraiment sa place sur le topic C#.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Results[0] = result.Remove( result.IndexOf( "StatusText" ), result.Length - result.IndexOf( "StatusText" ) ).Substring( result.IndexOf( "Status" ) + 7 );
    Ça extrait la valeur du status. Quand ça trouve autre chose que 100 ou 101, ça lance une exception maison.

    Si un de mes étudiants me donnait du code comme cela, il aurait zéro.

    En attendant, peux-tu simplement afficher le contenu de la variable 'result'?

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Lorsque le numéro de téléphone est valide, la variable result contient "0: Accepted for delivery "
    Si le numéro de téléphone est invalide, il y a un autre message le disant.

    Mais comme j'ai dis plus haut, je pense que le problème vient des messages de retour envoyés par le serveur kannel/le modem programmable. Ceux-ci ne correspondent pas à ce que mon appli est censée recevoir. ça aurait du sens puisque le modem a été changé il y a environ 6 mois, date à laquelle l'appli a commencé a bugger. Seulement je ne trouve rien qui décrive ces messages de retour dans la doc utilisateur...
    C'est un modèle FXT009 de Sierra Wireless qui est utilisé: http://www.sierrawireless.com/en/pro...tend_EDGE.aspx

Discussions similaires

  1. comment envoyer des sms
    Par ricardvince dans le forum Hardware
    Réponses: 7
    Dernier message: 08/03/2007, 11h48
  2. envoyer des sms de mon programme ver un portable
    Par Nadirov dans le forum Delphi
    Réponses: 3
    Dernier message: 14/08/2006, 16h29
  3. Un composant pour envoyer des SMS, ça existe ?
    Par Revan777 dans le forum C++Builder
    Réponses: 1
    Dernier message: 16/01/2006, 16h20
  4. Envoyer des SMS via une application en C++
    Par yakotey dans le forum C++
    Réponses: 1
    Dernier message: 09/01/2006, 19h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo