none
Probleme Class metier et Web Service Soap RRS feed

  • Question

  • Bonjour amis développeur,

    Je vous explique mon problème :

    J'ai créer une bibliothèque de classe ( classe image, utilisateur, niveau ...)

    Les classes sont tout ce qui a de plus classique : Get set et constructeur.

    Ensuite dans cette même solutions j'ai créer un nouveau projet web service.

    je créer une méthode ajouterUtilisateur dans la classe Service.vb :

     <WebMethod()> _
        Public Sub AjouterUtilisateur(ByVal newUtilisateur As MonAlbumArchi.utilisateur)
            Dim query As String = "INSERT INTO utilisateur (nom, prenom,adresse,idNiveau,pseudo,password) VALUES (@nom,@prenom,@adresse,@idNiveau,@pseudo,@password)"
    
            Dim commande As SqlCommand = New SqlCommand(query)
    
            With commande.Parameters
                .Add("@nom", SqlDbType.NVarChar, 50)
                .Add("@prenom", SqlDbType.NVarChar, 50)
                .Add("@adresse", SqlDbType.VarChar)
                .Add("@idNiveau", SqlDbType.Int)
                .Add("@pseudo", SqlDbType.VarChar, 15)
                .Add("@password", SqlDbType.VarChar, 10)
            End With
    
            With commande
                .Parameters("@nom").Value = newUtilisateur.nom
                .Parameters("@prenom").Value = newUtilisateur.prenom
                .Parameters("@adresse").Value = newUtilisateur.adresse
                .Parameters("@idNiveau").Value = newUtilisateur.idNiveau
                .Parameters("@pseudo").Value = newUtilisateur.pseudo
                .Parameters("@password").Value = newUtilisateur.password
            End With
    
            OuvrirConnexion()
            commande.ExecuteNonQuery()
            FermerConnexion()
    
        End Sub

    Ensuite je créer une autre solution classique, j'ajoute une référence de service

    Je créer une petit formulaire pour ajouter mon utilisateur :

    puis appel ma méthode ajouterutilisateur :

    Imports MonAlbumArchi
    Partial Class admin_utilisateur
        Inherits System.Web.UI.Page
        Protected Sub button_ajouter_Click(sender As Object, e As System.EventArgs) Handles button_ajouter.Click
            Dim myservice As New monAlbumService.ServiceSoapClient
    
            Dim newUtilisateur As utilisateur = New utilisateur(Me.textBox_nom.Text, Me.textBox_prenom.Text, Me.textBox_adresse.Text, CType(Me.textBox_idNiveau.Text, Integer), Me.textBox_pseudo.Text, Me.textBox_password.Text)
    
            myservice.AjouterUtilisateur(newUtilisateur)
        End Sub
    End Class

    Il me dit Arguments trop nombreux pour public sub new.

    Vraiment bizarre puisque dans ma classe utilisateur mon constructeur possède ce nombre d'argument.

    Après quelque recherche je constate que le service Soap me créer une classe utilisateur avec un constructeur vide et n'utilise pas ma classe.

    Voici la classe que créer le webService :




    Voici la classe utilisateur que j'ai moi même créer :




    Comment faire pour que le service utilise ma classe, ou bien comment modifié la classe créer par le web service ?

    Merci a vous.

    jeudi 12 avril 2012 21:22

Réponses

  • Bonjour,

    ce qu'il faut bien comprendre, c'est que quand vous ajoutez une référence à un WebService, Visual Studio crée les objets dont il a besoin pour consommer le webService.

    Donc si dans votre service il y a la classe Utilisateur (ce serait bien de mettre un U majuscule soit dit en passant ;-)), cela signifie que côté client, Visual Studio va créer une classe Utilisateur avec les mêmes propriétés. Mais ce n'est pas la même classe (d'ailleurs, son espace de nom est différent).

    Quand vous ajoutez une référence de service, en réalité, Visual Studio télécharge le Wsdl qui décrit votre service, puis à partir de ce dernier, génère automatiquement toutes les classes dont il a besoin (donc votre classe Utilisateur). Remarquez que la classe Utilisateur côté client possède la méthode RaisePropertyChanged, et si vous regardez son code, vous verrez qu'il est fortement différent du votre.

    Donc maintenant si vous voulez que côté client, ce soit votre classe Utilisateur qui soit utilisée, il va falloir organiser votre code légèrement différemment. Il vous faut au moins 3 projets :

    • Projet1 : myWeb, projet web contenant le web Service
    • Projet2 : myEntities, projet contenant votre classe Utilisateur
    • Projet3 : myWinformClient, projet client consommant le web service

    myWeb référence myEntities.

    myWinformClient référence myEntities.

    Maintenant, dans myWinformClient, ajoutez la référence de service dans myWeb. Et vous verrez que cette fois, votre code client utilisera bien votre classe Utilisateur (c'est une option, cochée par défaut dans l'ajout de référence, quand vous ajoutez une référence de service, d'essayer d'utiliser des classes existantes dans le projet).

    Mais attention : si vous mettez à jour votre classe Utilisateur, il va falloir modifier votre projet web ET votre projet client.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 13 avril 2012 05:50
  • Bizarre, vous avez du rater quelque chose car ca marche normalement. J'ai refais rapidement le test, et ca marche bien.

    https://skydrive.live.com/redir.aspx?cid=bc9de0eb6cf2ff4e&resid=BC9DE0EB6CF2FF4E!1103&parid=BC9DE0EB6CF2FF4E!220


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 13 avril 2012 15:23

Toutes les réponses

  • Bonjour,

    ce qu'il faut bien comprendre, c'est que quand vous ajoutez une référence à un WebService, Visual Studio crée les objets dont il a besoin pour consommer le webService.

    Donc si dans votre service il y a la classe Utilisateur (ce serait bien de mettre un U majuscule soit dit en passant ;-)), cela signifie que côté client, Visual Studio va créer une classe Utilisateur avec les mêmes propriétés. Mais ce n'est pas la même classe (d'ailleurs, son espace de nom est différent).

    Quand vous ajoutez une référence de service, en réalité, Visual Studio télécharge le Wsdl qui décrit votre service, puis à partir de ce dernier, génère automatiquement toutes les classes dont il a besoin (donc votre classe Utilisateur). Remarquez que la classe Utilisateur côté client possède la méthode RaisePropertyChanged, et si vous regardez son code, vous verrez qu'il est fortement différent du votre.

    Donc maintenant si vous voulez que côté client, ce soit votre classe Utilisateur qui soit utilisée, il va falloir organiser votre code légèrement différemment. Il vous faut au moins 3 projets :

    • Projet1 : myWeb, projet web contenant le web Service
    • Projet2 : myEntities, projet contenant votre classe Utilisateur
    • Projet3 : myWinformClient, projet client consommant le web service

    myWeb référence myEntities.

    myWinformClient référence myEntities.

    Maintenant, dans myWinformClient, ajoutez la référence de service dans myWeb. Et vous verrez que cette fois, votre code client utilisera bien votre classe Utilisateur (c'est une option, cochée par défaut dans l'ajout de référence, quand vous ajoutez une référence de service, d'essayer d'utiliser des classes existantes dans le projet).

    Mais attention : si vous mettez à jour votre classe Utilisateur, il va falloir modifier votre projet web ET votre projet client.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 13 avril 2012 05:50
  • Bonjour Richard,

    Tout d'abord un grand merci pour votre aide et vos conseil.

    J'ai donc procéder comme vous l'avez mentionné, a savoir :

    J'ai une projet Client qui a comme référence la dll de mon projet librairie + la référence WebService de mon projet WS

    Mon projet librairie contient mes classes ( utilisateur, image, niveau ...)

    Mon projet web service avec mes fonction et méthode ( ajouter, modifier, supprimer et lister ) qui contient la référence malibrairie.dll

    J'ai donc supprimer mes classes dans le projet WebService.

    J'ai mis a jour la référence service dans mon projet client mais j'ai toujours une erreur :

      Protected Sub button_ajouter_Click(sender As Object, e As System.EventArgs) Handles button_ajouter.Click
            Dim myservice As New monAlbumService.ServiceSoapClient
    
            Dim newUtilisateur As utilisateur = New utilisateur(Me.textBox_nom.Text, Me.textBox_prenom.Text, Me.textBox_adresse.Text, CType(Me.textBox_idNiveau.Text, Integer), Me.textBox_pseudo.Text, Me.textBox_password.Text)
    
            myservice.AjouterUtilisateur(newUtilisateur)
        End Sub

    Quand je passe en paramètre de ma méthode AjouterUtilisateur la variable "newUtilisateur " il m'affiche le message suivant :

    Impossible de convertir une valeur de type monAlbumLibrairie.Utilisateur en monAlbumService.Utilisateur

    Pourtant dans ma méthode ( dans le projet WS ) je passe en paramètre la class utilisateur de ma librairie :

     <WebMethod()> _
        Public Sub AjouterUtilisateur(ByVal newUtilisateur As utilisateur)
    Merci par avance pour votre aide.


    vendredi 13 avril 2012 13:32
  • Bizarre, vous avez du rater quelque chose car ca marche normalement. J'ai refais rapidement le test, et ca marche bien.

    https://skydrive.live.com/redir.aspx?cid=bc9de0eb6cf2ff4e&resid=BC9DE0EB6CF2FF4E!1103&parid=BC9DE0EB6CF2FF4E!220


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 13 avril 2012 15:23
  • Juste, comment dire euh !!

    Un Grand, Un énorme, Un Immense Merci, Richard pour votre aide si précieuse.

    Grâce a vous , je vais pouvoir avancé considérablement ce projet qui doit être présenté dans 1 mois dans le cadre d'un examen.



    vendredi 13 avril 2012 18:30