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

Entity Framework Discussion :

Problème de web-service WCF avec EF4


Sujet :

Entity Framework

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Points : 46
    Points
    46
    Par défaut Problème de web-service WCF avec EF4
    Bonjour,

    J'ai une question sur les web-services WCF couplé à EF4.

    J'ai créé une solution "webservice" qui se compose en 4 parties : DAL (contenant l'edmx), POCO, BLL (contenant les CRUD), WEB-SERVICES.

    Dans un de mes webservice j'ai une méthode getAllUsers() tout bête voici son implémentation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           public List<use_user> getAllUsers() { 
                return new use_user_manager().select();
            }
    La méthode fonctionne correctement car je l'ai testé avec une appli console.

    Cependant quand j’appelle le web-service depuis une autre solution, il me provoque l'erreur suivante :

    La connexion sous-jacente a été fermée : La connexion a été interrompue de manière inattendue.
    Sachant que si à la place d'une liste d'objets use_user je retourne une liste de string cela marche, j'ai l'impression qu'il n'arrive pas à sérialiser/dé-sérialiser en quelque sorte mon objet pour que je puisse le récupérer dans mon application qui appelle le web-service.

    De plus, j'ai essayé (croyant que le problème venait de là) de supprimer les POCO et de conserver les classes de l'edmx, et le résultat est le même.

    Avez-vous une idée sur la question?

    Merci et bonnes fêtes de fin d'année.


    Pour informations voici mon Web.config :

    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
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <connectionStrings>
        <add name="bdd_mobiwall_entities" connectionString="metadata=res://*/mobiwall.csdl|res://*/mobiwall.ssdl|res://*/mobiwall.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=ROYCOURT-PC\INSTANCESQL;Initial Catalog=bdd_mobiwall;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
      </connectionStrings>
      <system.web>
        <compilation debug="true" targetFramework="4.0">
          <assemblies>
            <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          </assemblies>
        </compilation>
      </system.web>
      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior>
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
      </system.serviceModel>
      <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
      </system.webServer>
    </configuration>

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Tes classes sont elles sérialisables? Utilises tu les attributs DataMember et DataContract?

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    Mes classes ont été générées par l'edmx, donc par défaut elles sont sérialisables non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        [EdmEntityTypeAttribute(NamespaceName="bdd_mobiwall_model", Name="mes_message")]
        [Serializable()]
        [DataContractAttribute(IsReference=true)]
        public partial class mes_message : EntityObject
        {
    Après peut-être faut-il également rajouter une balise dans mon interface qui décrit mon service?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       [ServiceContract]
        public interface IServiceUser
        {
           [OperationContract]
           List<use_user> selectAll();
        }

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Alors effectivement, il faut que tous les types qui transitent par ton webservice (notamment user_user) soient [DataContract], que les propriétés de ceux ci soient [DataMember]. Que ton interface de service soit [ServiceContract] et que les méthodes du contrat soient [OperationContract].

    Par ailleurs, arrives tu à afficher le wsdl de ton service?

    Enfin, sais-tu qu'en C#, il existe des conventions pour les noms de classes, noms de méthode, etc. http://msdn.microsoft.com/en-us/library/ms229043.aspx

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    Oui j'arrive à afficher le wsdl sans problème dans le navigateur.

    Désolé pour les conventions de nommage non respectées, j'ai gardé les habitudes de mon entreprise.

    Cependant, sachant que c'est l'edmx qui a généré les classes il ne peut pas y avoir d'erreur d'oublie de balise pour la sérialisation.

    Pour le moment il semblerait que j'envoie un objet fesant référence à une connexion à la base de donnée (via EF), et que cette référence n’existant pas coté client, la désérialisation lève une exception puisqu'elle a besoin de cette référence pour reconstruire l’objet coté client.

    Je ne comprend vraiment pas d'ou mon erreur peut venir...

  6. #6
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    Merci de votre aide, grâce à quelqu'un de mon école j'ai pu résoudre mon problème.

    Pour information voici sa solution :

    Par défaut Entity Framework génère des entités « proxy », pour éviter de tout charger (il charge seulement les propriétés quand il en a besoin).
    Donc forcément quand tu le transfère via le service, il ne peut plus chopper les informations.

    Il suffit donc de rajouter 1 ligne pour que ça marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _entities.ContextOptions.ProxyCreationEnabled = false;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Consommer Web Service WCF avec du JavaScript
    Par jayce23 dans le forum ASP.NET
    Réponses: 0
    Dernier message: 18/02/2014, 23h31
  2. Réponses: 2
    Dernier message: 11/02/2014, 16h46
  3. Réponses: 0
    Dernier message: 24/03/2011, 13h49
  4. Réponses: 2
    Dernier message: 11/05/2010, 13h15
  5. probléme génération de web service client avec Axis2
    Par jonestar dans le forum Services Web
    Réponses: 0
    Dernier message: 05/05/2010, 12h31

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