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

Silverlight Discussion :

Domaine Service WCF - retourner les exceptions au client


Sujet :

Silverlight

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Par défaut Domaine Service WCF - retourner les exceptions au client
    • Je développe en C# .Net, Silverlight, VS2010, J'utilise un Domaine Service (DS), et j'aimerais pouvoir retourner les exceptions détaillées telle qu'elle se sont produites sur le serveur, au lieu du simple message qui dit que le domaine service a généré une exception.
    • Pour l'exemple :

    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
    DS d = new DS();
     
    FAMILLES_ARTICLES f = new FAMILLES_ARTICLES();
    f.DES_FAMILLE_ARTICLE = "FAM-11";
    f.REF_FAMILLE_ARTICLE = "Famille 11";
    f.ID_FAMILLE_ARTICLE = 11;
     
    d.FAMILLES_ARTICLES.Add(f);
     
    for (int i = 1; i <= 20; i++)
    {
        SOUS_FAMILLES_ARTICLES sf = new SOUS_FAMILLES_ARTICLES();
     
        sf.DES_SOUS_FAMILLE_ARTICLE = "SFAM-" + i.ToString();
        sf.REF_SOUS_FAMILLE_ARTICLE = "Sous Famille " + i.ToString();
        sf.ID_SOUS_FAMILLE_ARTICLE = i;
        sf.ID_FAMILLE_ARTICLE = 11;
     
        d.SOUS_FAMILLES_ARTICLES.Add(sf);
    }
     
    d.SubmitChanges();
    • Dans le cas ou par exemple une insertion déclenche une exception, es-que je peut savoir c'est la quelle exactement ?
    • Une autre question : es-que le SubmitChanges() fait exécuter toutes les requêtes en une transaction, ou bien faut le gérer ? et s'il faut le gérer, Comment ?

    Merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    salut,

    Pour gérer les exeptions coté serveur, moi j'utilise:

    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
    [Invoke()]
            public string AddCountry(CountrysTbl myAli)
            {
                try
                {
                   ....     
                 return ""
        }
                catch (Exception e)
                {
                    return e.InnerException.Message;
                    }
     
                }
            }
    Ce code retourne "" si ça se passe bien dans le Try et sinon, retourne le message d'erreur.

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Par défaut
    Merci,

    • Le code que tu viens de me donner sous-entend que je dois appeler explicitement la méthode AddCountry() au lieu de faire des add() puis appeler SubmitChanges()
    • Es qu’il y aurais pas un moyen de savoir quelle insertion à poser problème en travaillant avec SubmitChanges() ?
    • Jais déjà travailler avec des appels directes à des méthodes d’insertion, sans passer par SubmitChanges() , mais dans ce cas et à cause de l’asynchronisme ça devient trop approximatif dans le sens ou si une insertion échoue dans la boucle, les autres peuvent passer quand même, et il faut revenir derrière pour voir si tout s’est passé comme prévus, avec des Callback etc… pour une petite application ça n’aurais pas était trop grave, mais pour une grosse application ça devient fastidieux et la lisibilité du code en prend un sacrés coup avec les Callback en chaine pour garantir la séquentialité des appels,
    • c’est pour ça que je me suis tourné vers .add() puis SubmitChanges(), et puis ça a l’aire de me garantir que tous les traitements déclenchées par SubmitChanges() sont effectuées en une transaction, jais remarquer que si une insertion échoue dans le lot , les autres insertions ne sont pas exécutée, je ne sais pas si c’est toujours le cas ou bien c’est juste un hasard

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Autre morceau de code en VB cette fois:

    JUserDS est un domain data service défini comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            <riaControls:DomainDataSource x:Name="JUserDS" QueryName="GetJUserByGroupeUtilisateurIdQuery" AutoLoad="True" SubmittedChanges="JUserDS_SubmittedChanges" LoadedData="JUserDS_LoadedData">
    et donc une fois que les changements sont soumis, tu peux tester l'erreur.

    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
      Private Sub JUserDS_SubmittedChanges(ByVal sender As Object, ByVal e As SubmittedChangesEventArgs)
            If e.Error IsNot Nothing AndAlso e.Error.Message.ToString <> "" Then
                If e.Error.Message.ToString.Contains("The DELETE statement conflicted with the REFERENCE constraint ") Then
                    JInfoWindow.Show("Veuillez supprimer tous les enregistrements enfants en premier", "Error")
     
                ElseIf e.Error.Message.ToString.Contains("Violation of UNIQUE KEY constraint 'unique_JUserName'") Then
                    MessageBox.Show("Il existe déjà un JUser avec ce même nom", "Création du JUser annulée", MessageBoxButton.OK)
     
                    'puisque j'ai rajouté un JUser qui existait déjà, il me faut le retirer
                    For Each entity As Object In JUserDS.DomainContext.EntityContainer.GetChanges.AddedEntities
                        If TypeOf entity Is JUserTbl Then
                            CType(JUserDS.DomainContext, J_Context).JUserTbls.Remove(entity)
                        End If
                    Next
     
                    e.MarkErrorAsHandled()
     
     
                Else
    ....

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Par défaut
    merci,
    après avoir cherché je suis tombé sur ça :
    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
    DS.SubmitChanges(submitOperation =>
                                {
                                    if (submitOperation.HasError)
                                    {
                                        //RadWindow.Alert(submitOperation.Error.Message);
                                        RadWindow.Alert("Opération impossible sur  " + submitOperation.EntitiesInError.FirstOrDefault().ToString());
                                        submitOperation.MarkErrorAsHandled();
                                    }
                                    else
                                    {
                                         //faire autre chose dans le cas ou c'est bien passé
                                    }
                                },
                                null
                );
    C'est presque exactement ce que tu ma donné, mais sans ajouter un événement pour récupérer l'erreur a partir du "e" de ton événement, on peut récupérer la même chose a partir de submitOperationavec cette écriture.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Ben oui, c'est mieux car c'est plus concis !
    L'avantage des expressions lamdas

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

Discussions similaires

  1. probléme avec service WCF et les fichiers volumineux
    Par kikov dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 08/07/2014, 10h22
  2. Réponses: 2
    Dernier message: 04/09/2011, 10h22
  3. Réponses: 0
    Dernier message: 24/03/2011, 13h49
  4. Réponses: 7
    Dernier message: 16/04/2008, 16h42

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