Canalblog
Suivre ce blog Administration + Créer mon blog

Halim

Archives
28 mars 2005

Consommer un service Web dans Javascript

Problématique traitée : L’exemple que je traite dans ce tutorial, m’a été suggéré par un collègue qui voulait suivre les visites des internautes entre deux sites données n'utilisant pas le framework .Net.
Pré-requis : .Net, C#, Javascript

service_xml

Le travail à effectuer pour résoudre ce problème peut se composer en 3 étapes :
a. Créer le web service
b. Génération d'un proxy de service Web XML
c. Consommation du service Web à partir d’une page Html

a. Création du web service
Pour créer le web service en question, on peut utiliser la template fournie dans l’environnement Visual.Net ou utiliser le célèbre notepad (ce qui est fastidieux mais largement accessible !..).

VisitCounter.asmx

using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Data.SqlClient;
using System;

public class VisitCounter: System.Web.Services.WebService
{
[WebMethod]
public bool saveVisitHint (string vdtVisit, string vsiteName1, string vsiteName2, string vip, string vcompaignName)
{
try {
string _strConn = "";
"uid=saconn;pwd=myPassword;database=VisitCounterDB;server=(local);";
SqlConnection oConn = new SqlConnection(_strConn);
oConn.Open();
SqlCommand oComm = new SqlCommand("insert into TVisitCounter(dtVisit,siteName1,siteName2,ipAdress,compaignName) values ('" + vdtVisit +"','" + vsiteName1 + "','" + vsiteName2 + "','" + vip +"','" +vcompaignName+"');", oConn);

oComm.ExecuteNonQuery();
return true;
}
catch (Exception e)
{
return false;
}
}
}

Ce web service permet d’enregistrer le clic de l’utilisateur dans une base de données sql server (date visite, Site source, site de destination, adresse IP du client, nom de campagne).

b. Génération d'un proxy de service Web XML
Pour accéder à un service Web XML à partir d'une application cliente, vous ajoutez d'abord une référence Web, qui est une référence à un service Web XML. Quand vous créez une référence Web, Visual Studio crée automatiquement une classe proxy de service Web XML et l'ajoute à votre projet. Cette classe proxy expose les méthodes du service Web XML et gère le marshaling des arguments appropriés entre le service Web XML et votre application. Visual Studio utilise le langage WSDL pour créer le proxy.
Pour cela, on utilise l’utilitaire WSDL comme suit
c:> WSDL http://localhost/yourWebServices/ VisitCounter.asmx?WSDL

c. Consommation du service Web à partir d’une page Html
<html>
<head >
    <title>Untitled Page</title>
    <script language = "JavaScript">
        function init(){
            alert("Debut ");
            service.useService("
http://localhost/VisiteCounterService/VisitCounter.asmx?WSDL","Service1");
        }
   
        // Traitement d'appel à la méthode saveVisitHint du serviceWeb
        function imageClicked ()
        {
            var iCallID;
            var d = new Date();
            
            var vDate = d.getYear() + "-" + (d.getMonth()+1) + "-" + d.getDate() + " " + d.getHours() +":" + d.getMinutes() +":" + d.getSeconds() + ".000";
            alert (vDate);
            
            iCallID = service.Service1.callService(oCallHandler,"saveVisitHint",vDate,"site Appelant", "site Appelé", "192.100.120.453", "Nom Comapgne") ;
            
        }
        function oCallHandler (result)
        {
            if (result.error)
            {
                    var retResultcode = result.errorDetail.code;
                    alert (retResultcode);
                    var retResultstring = result.errorDetail.string;
                    alert (retResultstring);
                    var retResultsoap = result.errorDetail.raw;
                    alert (retResultsoap);
            }
            else
            {
                alert(result.value);
            }
        }

    </script>
</head>
<body onLoad="init()">
   
    <img src="logo_acadomia.jpg" onclick = "imageClicked()"/>
    <div id="service" style="behavior:url(webservice.htc)" >
       
    </div>   
</body>
</html>

Remarque : Il faut télécharger le fichier Webservice.htc et le placer dans le repertoire où réside la page html.

Publicité
28 mars 2005

Intégrer un contrôle utilisateur Windows dans une page HTML

But de l'article : créer un contrôle utilisateur Windows et l'intégrer dans une page HTML

Pré-requis : C#, Création des contrôles utilisateur, HTML

La première phase de ce tutorial est la création du contrôle utilisateur. On ne va réinventer la roue, on va créer un contrôle utilisateur qui hérite du contrôle Windows Panel. La classe GraphicPanelControl se présente comme suit  sous le designer des classes sous VS.NET 2005 Beta 1:

classe_graphicpanelcontrol1

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
 
namespace GraphicPanelNamespace
{
      public class GraphicPanelControl: Panel
      {
            
            #region "attributs"
            private int _lineWidth;
            private Color _lineColor;
            private bool _captured;
            private Point _lastPoint;
            private Color _backgroundColor;
 
            #endregion
 
            #region "accesseurs"
            public int LineWidth
            {
                  get
                  {
                        return _lineWidth;
                  }
                  set
                  {
                        _lineWidth = value;
                  }
            }
            public Color LineColor
            {
                   get
                  {
                        return _lineColor;
                  }
                   set
                  {
                        _lineColor = value;
                  }
            }
      
            public Color BackgroundColor
            {
                get   
                {
                    return _backgroundColor;
                }
 
                set
                {
                    _backgroundColor = value;
                }
        }
        #endregion
        protected override void OnMouseDown (MouseEventArgs e)
            {
                  base.OnMouseDown(e);
                  if (e.Button == MouseButtons.Left)
                  {
                        _lastPoint = new Point(e.X, e.Y);
                        _captured = true;
                  }
 
            }
         protected override void OnMouseMove (MouseEventArgs e)
            {
                  base.OnMouseMove(e);
                  if (_captured )
                  {
                       Point currentPoint = new Point(e.X, e.Y);
                        Pen PenDraw = new Pen(_lineColor,_lineWidth);
 
                        Graphics g = this.CreateGraphics();
                        g.DrawLine    (PenDraw,_lastPoint.X,_lastPoint.Y,currentPoint.X,currentPoint.Y);
                        _lastPoint = currentPoint;
                        g.Dispose();
                        PenDraw.Dispose();
 
                  }
            }
            protected override void OnMouseUp (MouseEventArgs e)
            {
                 base.OnMouseUp(e);
                  if (e.Button == MouseButtons.Left)
                  {
                        _captured = false;
                  }
            }
   
            private System.ComponentModel.Container components = null;
 
            public GraphicPanelControl()
            {               
                  InitializeComponent();
            }
 
            protected override void Dispose( bool disposing )
            {
                  if( disposing )
                  {
                        if( components != null )
                             components.Dispose();
                  }
                  base.Dispose( disposing );
            }
 
            #region Code généré par le Concepteur de composants
            
           private void InitializeComponent()
            {
                  components = new System.ComponentModel.Container();
            }
        #endregion
    }
}

On génère la dll GraphicPanelControl et on copie la dll générèe dans le répertoire C:\inetpub\wwwroot

<html xmlns="http://www.w3.org/1999/xhtml" >
<body>

<object width = 600 height = 400 classid="http:GraphicPanelGraphic.dll#GraphicPanelNamespace.GraphicPanelControl">

<param name="LineWidth" value="6" />
<param name="LineColor" value="red" />
<param name="BackgroundColor" value = "lightGray"/>

</object></body>
</html

28 mars 2005

les génériques dans C#

C# introduit quelques notions importantes dans sa version 2, parmi lesquels :
Les génériques,
Les itératives,
Les classes partiels,
Les méthodes anonymes.

Dans cet article, premier d’une série de quatres articles, on va discuter des génériques et leurs implémentation dans C# V2.

Génériques :
Les Génériques sont utilisés pour rendre le code des composants logiciels plus réutilisables. Ce sont des types de structures données qui ne changent et qui s’adaptent au contexte d’exécution.
A chaque fois qu’un générique est utilisé, il peut être personnalisé pour différents types de données sans être obligé de réécrire le code du composant. Les génériques permettent aux classes, structures, interfaces, delegates et méthodes d’être paramétrables par les type de données qu’elles stockent et manipulent.

Avantages des génériques :
Le programme devient typé de manière statique, et donc les erreurs de typage sont détectes au niveau de la compilation.
Les conversions de type ne sont plus requises au niveau de l’exécution et donc l’exécution des programmes se trouve accélérée.
Les types primitifs (type int) n’ont pas besoin d’être Wrappé, d’où des programmes plus rapides et utilisant moins d’espace de stockage.

Implémentation de génériques :
Dans cet exemple, on va implémenter une liste générique. Cette liste est utilisée dans le programme, qui instancie la liste pour des types de données (int32 et string) .

namespace GenericsProject
{
    public class GArrayList
    {
        private T[] items;
        private int cpt;
        private const int dim = 10;

     public GArrayList()
        {
            items = new T[dim];
            cpt = 0;
        }
        public void Add (T elem)
        {
            if (cpt < dim-1)
                items[cpt++] = elem;
            else
                throw new Exception(" Overflow ");
        }
        public T GetItem(int index)
        {
            return items[index];
        }
    }
}


namespace GenericsProject
{
    class Program
    {
        static void Main(string[] args)
        {
            GArrayList intList = new GArrayList();
            intList.Add(12);
            intList.Add(13);
            intList.Add(14);
            
            for (int i = 0; i < 3; i++)
                Console.WriteLine(intList.GetItem(i));
            Console.ReadLine();

            GArrayList StringList = new GArrayList();
            StringList.Add("VAL1");
            StringList.Add("VAL2");
            StringList.Add("VAL3");
            for (int i = 0; i < 3; i++)
                Console.WriteLine(StringList.GetItem(i));
            Console.ReadLine();

        }
    }
}

Utilisation des Multi-Types dans les Génériques :
On peut définir plus d’un type dans une définition de générique. Un exemple type de cette implémentation est dictionary qui doit avoir un type générique pour la clé et un autre pour la valeur.

Public class GenericDictionary
{
   public void Add(T1 key, T2 value)
   {
     // ...
   }
   public T2 this[KeyType key]
   {
     // ...
   }

   Public void Add (T1 key, T2 Value)
   {
     // ...

   }
}

Méthodes génériques
Une autre application des génériques concerne les méthodes.
public class Classe1
{
   protected T GenericMethod (T item)
   {
      return item;
   }
}

27 mars 2005

Visual Studio 2005 Beta 2 se fait attendre

HANOVER, GERMANY -- The second beta release of Visual Studio 2005, a new release of Microsoft's developer tool set, has slipped into April, a company spokesperson said this week. The final version of the product is due in September, he said. 

Microsoft had said it would deliver Visual Studio 2005 Beta 2 by the end of March. The company won't make that deadline because it is still working on the product, said Said Zahedani, director of the developer platform and strategy group at Microsoft's German subsidiary during a news conference at the CeBIT trade show here.

Microsoft plans to deliver the final version of Visual Studio 2005 at its Professional Developers Conference in September in Los Angeles, Zahedani said. However, feedback from the second beta could change those plans and push final release into the fourth quarter, he said.
26 mars 2005

Et Le débogage devient plaisir !!!

Comme l’a dit Mr. Knuth Le développement d’applications est un art, et comme dans tout art, il y a du déchet. La vie des développeurs est ponctuée de grandes joie et de grandes périodes de déprime et de stress à cause de ces maudits bugs. Donc, tout ce qui permet de faire raccourcir ces périodes noires est le bienvenue !!!
Comme Microsoft a beaucoup de compassion envers cette frange de population et leur veut beaucoup de bien, voilà qu’elle propose un certain nombre d’outils censés aider le développeur à débusquer les erreurs et par la même le rendre plus productif.

Lorsque vous êtes entrain de déboguer une application, souvent vous voulez connaître le contenu d’une variable. Dans cet exemple, considérons la classe Personne (source1.txt), qui possède des attributs et des proprietes

Le dataTip est affiché au sein de la fenêtre du code, lorsque la souris survole une variable. Cette fenêtre peut être étendue et fermée à volonté …

Le contenu du DataTip est similaire à celui affiché dans le Quick View ou la fenêtre Watch. L’avantage d’utiliser le DataTip est que le développeur n’est pas obligé de switcher entre les différentes fenêtres.

debugimage0
On remarque que le DataTips affiche le contenu de tous les membres internes de la classe ainsi que les propriétés publiques, ce qui induit une confusion et une redondance de données. D’où la nécessité de filtrer les membres à visionner.

Pour personnaliser l’affichage dans la DataTip, Quick Watch ou la fenêtre Watch, on doit utiliser les attributs de Debugger. Dans ce qui suit, on va discuter ces attributs qui se trouvent dans le namespace System.Diagnostics

DebuggerDisplayAttribute
    Cet attribut est utilisé pour fournir un sommaire du contenu d’une classe. Le sommaire est personnalisable suivant les desiderata du développeur. Cet attribut peut être appliqué aux éléments suivants :
Classes
Structs
Delegates
Enums
Fileds
Interfaces
Proprietes
Assemblies

Exemple d'utilisation de l'attribut DebuggerDisplay

[DebuggerDisplay("Personne ({FullName})")]
Public class Personne
{
…..
}

Le debogueur utilise la chaîne donnée en argument comme spécification de format d’affichage. La donnée qui se trouve entre les accolades peut être une méthode, une propriété ou une variable locale et peut avoir n’importe quelle visibilité (public, private …). Lorsqu’on déroule l’objet, les variables locales et les propriétes sont toujours visibles. Il existe deux méthodes de personaliser l’affichage lorsque l’objet est déroulé. Un exemple est donné (source2.txt) donnant le résultat suivant

debugimage11

DebuggerBrowsableAttribute
    L’attribut DebuggerBrowsableAttribute est ajouté aux members s'ils doivent être visibles ou pas. Cet attribut possède un parametre de type DebuggBrowsableState, cet attribut peut prendre une de ces valeurs : Collapsed, Never, RootHidden, Expanded.

L'exemple (source3.txt) montre l'utilisation de l'attribut DebuggerBrowsableAttribute avec comme valeur never, donnant le résultat suivant lors du débogage. On remarque que les membres privés et les propriétés n'apparaissent plus dans le DataTips.

debugimage2

DebuggerTypeProxy
Lorsque l’attribut DebuggerTypeProxy est ajouté à un type, il spécifie une classe désignée pour prendre en main l'affichage du type en question. Habituellement, on définit le proxy comme une classe interne (internal). Il est habituel de définir le proxy pour le type comme une classe interne avec un accées total aux membres privés.
La classe proxy doit avoir un constructeur public qui accepte comme argument le type en question. Toutes les propriétés publiques du proxy peuvent être utilisés pour former la chaine d’affichage et toutes les variables de type private ou proected ne seront pas affichées.

L'exemple (source4.txt) montre l'utilisation de l'attribut DebuggerTypeProxy, donnant le résultat suivant lors du débogage.

debugimage31

Le contenu de l'objet qu'on inspecte est affiché par la classe proxy désigné par l'attribut [DebuggerTypeProxy(typeof(CitoyenProxy))].

Cet article va être complété prochainement en abordant les Visualizers, qui seront à mon avis d'un grand secours au développeur et disponibles dans la beta 2.

To be continued ...

Publicité
24 mars 2005

Que du bonheur !!

dev_days_2005

Aujourd’hui, j’ai assisté aux developer Days 2005 à Paris, et je suis conquis !!!

L’environnement de développement phare de Microsoft Visual .Net 2005 Beta 2 vient de franchir une étape déterminante pour l’introniser comme l’outil de référence de développement de solutions innovantes.

J’ai hâte d’installer cette version sur ma machine, mais ma seule crainte c’est que ma pauvre machine ne puisse supporter un tel outil…

19 février 2005

Commandez votre Visual Studio 2005 Beta

Pour ne pas rater le coach et être parmi les pionniers de la technologie .Net, Commandez le DVD Visual Studio 2005 Beta. Il est vrai que si vous authentifier en étant résidant en France, une contribution de 5 euros vous sera demandée, Mais ça vaut vraiment la peine !!!.
http://lab.msdn.microsoft.com/vs2005/get/emeaorder/default.aspx

Publicité
Publicité
Publicité