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

Windows Communication Foundation .NET Discussion :

Log d'applications WCF


Sujet :

Windows Communication Foundation .NET

  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut Log d'applications WCF
    Bonjour, je cherche à logger les connexion/déconnexions de mes canaux entre mes clients et serveurs.

    J'ai trouvé cela en cherchant sur le net :
    http://msdn.microsoft.com/en-us/library/ms730064.aspx
    http://msdn.microsoft.com/en-us/library/aa702726.aspx

    Mais je n'utilise pas de fichiers de config pour paramétrer les connexions, je mets mes endpoints de connexion en dur dans le code (pour après gérer depuis une base de données pour ceux que ça choque).

    So, question, comment spécifier le processus de log en passant par du code ?

    Merci

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Par défaut
    Si je peux te donner un conseil, travailles plutôt avec le fichier de configuration plutôt que de coder en dure ce type de paramètre.
    WCF a été conçu principalement dans cette optique.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Comme précisé dans mon premier message, je sais qu'elle est l'optique de WCF et ses fichiers de conf, mais on veut un système facilement déployable et adaptable, passant par une BDD commune. Une MAJ de la bdd permet ainsi de migrer tout le monde simplement, et permet aussi de gérer les dépendances entre serveurs.

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Tu fais un objet x qui implémente IEndpointBehavior (disons "Ebehav")

    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
    public class Ebehav: IEndpointBehavior
        {
            #region IEndpointBehavior Members
    
            public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
            {
            }
    
            public void ApplyClientBehavior(ServiceEndpoint endpoint,
                System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
            {
            }
    
            public void ApplyDispatchBehavior(ServiceEndpoint endpoint,
                System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
            {
                endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new DispatchMessageInspector());
    
            }
    
            public void Validate(ServiceEndpoint endpoint)
            {
            }
    
            #endregion
        }
    et :
    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
     
    class DispatchMessageInspector : IDispatchMessageInspector
        {
            #region IDispatchMessageInspector Members
     
            public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request,
                System.ServiceModel.IClientChannel channel,
                System.ServiceModel.InstanceContext instanceContext)
            {
                    //Ici tu peux logger les appels en interceptant les headers
     
                     }
     
            public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
            {
                if (ServiceContext.Current == null) { return; }
                IList<ServerNotification> notifications= ServiceContext.Current.GetPendingNotifications();
                if (notifications!=null && notifications.Count!=0)
                {
                    MessageHeader h = MessageHeader.CreateHeader(Constants.MessageHeaderNotificationName, Constants.MessageHeaderNotificationNameSpace, notifications);
                    reply.Headers.Add(h);
                }
                OperationContext.Current.Extensions.Remove(ServiceContext.Current);
            }
     
            #endregion
       }
    Et dans ton code pour créer le host et les endpoints :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var _ebehav=new Ebehav();
    ServiceEndpoint serviceEndpoint=host.AddServiceEndPoint(type,binding,url);
    serviceEndPoint.Add(_ebehav);
    En tous cas, nous nous en servons avec Log4net, et ça fonctionne très bien!

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Merci, je testerai ça lundi

  6. #6
    Membre chevronné
    Avatar de sur_uix
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    Bonjour,

    un petit up sur ce post.

    Merci pour cette solution, je l'ai aussi implémenté pour l'utiliser via log4net.

    Mais comment faire pour pouvoir aussi logger les opérations de l'interface callback ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Salut,

    tu peux les logger dans BeforeSendReply.
    Perso j'ai fait un systeme de log qui me permet de detecter les bottleneck entre le moment ou l'appel arrive sur le WS et le moment ou il repart vers le client. Tres utile ! (penses à utiliser le return X de la méthode AfterReceiveRequest qui te permet d'envoyer un objet que tu souhaite dans la methode BeforeSendReply via le paramètre correlationState

  8. #8
    Membre chevronné
    Avatar de sur_uix
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    Merci pour la réponse, mais dans BeforeSendReply, c'est le retour d'une opération. C'est pas un callback dans le sens WCF.

    Dans mon service je récupère un EndPoint du client
    var m_callback = OperationContext.Current.GetCallbackChannel<MonInterface>();

    Et je voudrais pouvoir logger les opérations de m_callback.

    Sinon j'ai vu que je pouvais envoyer un objet via correlationState, mais j'avoue ne pas avoir trouvé de cas d'emploi !!!!!

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Ok.

    Pour ce qui est de l'utilité du correlationstate, ca me permet de stocker certaines infos dans un objet puis de les recuperer lorsque je renvoie la reponse au client.
    Ainsi je peux logger tout un tas d'informations en rapport à l'appel lorsque je le décide (par exemple, le temps entre l'arrivée dans le WS et le retour vers le client excede un certain temps, hop, j'enregistre en base les infos comme l'enveloppe soap d'envoi ou des choses comme ca, très utile pour reproduire le probleme ou pour analyser le bottleneck).

Discussions similaires

  1. Logging par Application - JBoss AS 6
    Par tupac25 dans le forum Wildfly/JBoss
    Réponses: 5
    Dernier message: 07/07/2011, 14h39
  2. Interface de Log pour application Web
    Par Cissine dans le forum Design Patterns
    Réponses: 0
    Dernier message: 09/03/2011, 16h55
  3. probleme de connexion avec une application WCF
    Par hajeronward dans le forum Windows Communication Foundation
    Réponses: 0
    Dernier message: 04/08/2010, 13h52
  4. Réponses: 1
    Dernier message: 14/12/2009, 09h47
  5. Application WCF console et Silverlight 2
    Par Kadelka dans le forum Windows Communication Foundation
    Réponses: 5
    Dernier message: 20/04/2009, 16h24

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