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 :

Appel à intervalle régulier service web WCF


Sujet :

Silverlight

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16
    Points : 9
    Points
    9
    Par défaut Appel à intervalle régulier service web WCF
    Bonjour à tous,

    Je suis en train de réaliser un projet de Vidéo Surveillance. J'utilise Silverlight côté client (je pense que c'est évident d'après le titre ^^ ) et un service web Duplex WCF. Mon client est divisé en 2 : 1 client diffuseur (diffuse l'image de sa webcam sur le serveur) et un client visualiseur (récupère l'image sur le serveur et l'affiche).
    Pour une question de simplicité, mon client transmet des images (pour l'instant 1 par seconde) et non un flux vidéo.

    Mon projet et quasiment fini, mais j'ai cependant un gros problème. Je vais vous expliquez brièvement comment fonctionne mon appli et vous présenter ce problème :

    Mon client diffuseur va poster à intervalle régulier l'image de sa webcam, grâce à un Timer. Pour l'instant tout va bien.

    Mon client visualiseur va récupérer cette image à intervalle régulier aussi, grâce à un DispatcherTimer (j'aurais pu aussi utiliser un Timer). Et c'est là que j'ai un problème. La méthode est bien appelé, mais le problème est qu'il faut que j'attende 5 secondes avant d'avoir ma valeur de retour (image). Pourquoi est-ce si long, je n'en sais rien.
    Mais avant que l'image n'arrive, le client a déjà fait une nouvelle requête au serveur, donc le temps pour que cette image parvienne au client est repoussé de 5 secondes et ainsi de suite pour toutes les autres images. Ce qui fait que lorsque j'arrête mon DispatcherTimer, il n'y a plus d'appels de méthode donc les images peuvent arriver et c'est ce qu'elles font. Je les ai toutes d'un coup.

    J'ai essayé en mettant la fréquence du DispatcherTimer à 15 secondes et je n'ai pas ce problème comme les valeurs de retour ont le temps d'arriver jusqu'au client.


    Auriez vous une solution à mon problème, qui est, si je ne me trompe pas, dû au fait que les échanges faits avec Silverlight sont Asynchrone.


    Merci d'avance pour vos réponses.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Advance_ Voir le message
    Auriez vous une solution à mon problème, qui est, si je ne me trompe pas, dû au fait que les échanges faits avec Silverlight sont Asynchrone.
    En lisant dés le début, je savais que le problème serait en rapport l'intervalle de temps qui est d'une seconde. Pour la lenteur des réponses c'est normal c'est du client/serveur. Il y a envoi vers + reception du serveur et je doute que ces deux actions soient instantanées.

    Le plus simple c'est :
    • d'obliger ton client à lire un flux vidéo (apparemment t'aimes pas ça)
    • de dire à ton à timer de n'envoyer une autre requête vers le serveur si et seulement la réponse de la dernière requête est bien reçue. Pour cela tu utilises un flag IsBusy que tu assignes à true lors de l'envoie d'une requête (bien sûr tu vérifies si il est à false avant d'envoyer la requête) et à false lorsque la requête est terminée.

  3. #3
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Ton image est brut peut etre ? Si c'est du bitmap c'est normal que ce soir long ! Il faudrait compresser.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Question bête : vu que tu renvoies des images à intervalle déterminé. Comment fais-tu pour le son ?

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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
    Points : 2 331
    Points
    2 331
    Par défaut
    En vidéosurveillance le son est secondaire, du moment que tu as x images à la seconde, ça suffit à la plupart des besoins !

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Merci pour vos réponses.

    Ton image est brut peut etre ? Si c'est du bitmap c'est normal que ce soir long ! Il faudrait compresser.
    En faite pour l'instant je fais avec des string (j'aurais peut être dû préciser dsl), pour les tests et pour que se soit plus simple. C'est pour ça que je trouve que c'est long. Mais sinon je vais utiliser un writeablebitmap.

    Le plus simple c'est :
    d'obliger ton client à lire un flux vidéo (apparemment t'aimes pas ça)
    En faite j'ai fait avec des images parce que je pensais que ça allait être plus simple. Est-ce tu pourrais me développer un peu plus sur ce point si c'est possible? Si ce n'est pas trop dure et pas trop long je vais me lancer dans cette voie. En faite il ne me reste qu'une semaine pour finir ce projet, j'ai rencontré plein de problèmes tout au long du projet, c'était la première fois que j'utilisais Silverlight et WCF et je faisais du développement web aussi poussé.

    Edit : J'ai regarder un peu sur google et j'ai trouvé ça : http://msdn.microsoft.com/fr-fr/library/cc668792.aspx
    C'est ça qu'il faut utiliser?



    de dire à ton à timer de n'envoyer une autre requête vers le serveur si et seulement la réponse de la dernière requête est bien reçue. Pour cela tu utilises un flag IsBusy que tu assignes à true lors de l'envoie d'une requête (bien sûr tu vérifies si il est à false avant d'envoyer la requête) et à false lorsque la requête est terminée.
    Merci pour l'astuce, mais du coup je n'aurais qu'une image toutes les 4 secondes environ. Tu aurais un petit lien qui décrit son fonctionne et comment l'utiliser, parce que j'ai cherché un peu et je n'ai pas été satisfait de mes recherches. A la limite si ce n'est pas parfait mais que ça marche, je pense que ça passera à la soutenance de projet.

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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
    Points : 2 331
    Points
    2 331
    Par défaut
    je vois déjà un élément à étudier : la durée côté serveur pour générer l'image et la sérialiser en byte[]... Essaies de mettre un StopWatch côté serveur et de logger les mesures... De plus, pour de la vidéosurveillance, il aurait été bien de te renseigner sur les pratiques de cet univers, la vidéo, tu peux voir ça comme un byte[] à l'affichage, mais des protocoles spéciaux existent, comme rtp/rtsp, pour faire transiter ça de manière optimisée.

    De plus, quelle est la résolution de ta caméra ? Une caméra HD induira un surcoût en temps de traitement et de communication.

    Data Service n'est pas fait pour ça. A mon sens, test déjà pour déterminer le pourquoi du mets autant de temps pour récupérer une image, la première optimisation est là...

    Tu vises quelle vitesse d'affichage ? 6 img/Sec ? 12 ?

  8. #8
    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
    Par défaut
    Citation Envoyé par Advance_ Voir le message
    Merci pour vos réponses.

    Edit : J'ai regarder un peu sur google et j'ai trouvé ça : http://msdn.microsoft.com/fr-fr/library/cc668792.aspx
    C'est ça qu'il faut utiliser?
    Ce que je ne comprend pas c'est pourquoi tu utilises un timer avec un service web Duplex WCF.
    Avec ce type de service, lorsque le serveur reçoit une image, ton client en est immédiatement notifié, et cela automatiquement, sans avoir à faire toi même la requête.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Merci pour vos réponses.

    De plus, pour de la vidéosurveillance, il aurait été bien de te renseigner sur les pratiques de cet univers, la vidéo, tu peux voir ça comme un byte[] à l'affichage, mais des protocoles spéciaux existent, comme rtp/rtsp, pour faire transiter ça de manière optimisée.

    De plus, quelle est la résolution de ta caméra ? Une caméra HD induira un surcoût en temps de traitement et de communication.

    Data Service n'est pas fait pour ça. A mon sens, test déjà pour déterminer le pourquoi du mets autant de temps pour récupérer une image, la première optimisation est là...

    Tu vises quelle vitesse d'affichage ? 6 img/Sec ? 12 ?
    Je vais abandonner l'idée de transmettre un flux vidéo pour l'instant.


    J'utilise un timer côté client pour appeler une méthode qui va me permettre de poster l'image sur le serveur à intervalle de temps régulier.

    Je suis en train de bosser sur mon projet et j'ai un problème. J'utilise un writeablebitmap, sauf que cet objet est présent côté client sur Silverlight et côté serveur sur mon service, sauf que celui de Silverlight est beaucoup plus limité, donc les 2 ne sont pas compatibles. Comment je peux faire pour transférer mon objet writeablebitmap du client (celui qui post les images) vers le serveur, puis du serveur vers mon autre client (celui qui visualise) ?

    J'ai essayé de transformer mon writeablebitmap en tableau d'entier, grâce à la propriété pixels, sauf que lorsque je le récupère sur mon deuxième client, je ne peux pas créer de writeablebitmap avec un tableau d'entier contenant la valeur de chaque pixel, en tout pas avec Silverlight.

    Ou sinon faut-il que je transforme ce tableau en image jpeg et que je l'affiche à l'écran comme le montre cet article : http://www.e-naxos.com/Blog/post/201...vuee280a6.aspx
    Je ne sais pas si c'est faisable.

    Merci d'avance pour vos réponses.

  10. #10
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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
    Points : 2 331
    Points
    2 331
    Par défaut
    Vouloir utiliser WritableBitmap part d'une bonne volonté si j'en juge la description msdn :

    Utilisez la classe WriteableBitmap pour mettre à jour et restituer une bitmap image par image. Cela s'avère utile pour générer du contenu algorithmique, tel qu'une image fractale, et pour la visualisation de données, telle qu'un visualiseur de musique.

    La classe WriteableBitmap utilise deux mémoires tampons. La mémoire tampon d'arrière-plan est allouée dans la mémoire système et accumule du contenu qui n'est pas affiché actuellement. Le tampon d'affichage est alloué dans la mémoire système et contient le contenu affiché actuellement. Le système de rendu copie le tampon d'affichage vers la mémoire vidéo pour l'affichage.
    L'aspect image par image correspond bien à une notion d'affichage, mais n'oublie pas que là tu as une couche de communication en plus, qui à mon sens invalide le système. la communication ip ne sera pas aussi rapide que celle de ton proc avec ton système d'affichage en interne. Vois déjà pour appeler ta méthode et qu'elle te retourne un byte[] ou tout autre format simple à manipuler (à la rigueur compressé), et de l'afficher, histoire de parvenir déjà à un premier fonctionnel, une fois ça fait il y aura toujours moyen d'améliorer...

    Ta caméra, tu ne peux pas router le flux histoire que le serveur ne fasse rien et que le client SL aille tapper directement sur le flux ?

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 027
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 027
    Points : 5 469
    Points
    5 469
    Par défaut
    N'y a-t-il pas un soucis de config du service web? Le 5s me parait étrange dans la mesure ou c'est du local. Essaye avec un simplet HelloWorld. Si c'est toujours 5s dans le web Config il doit y avoir une valeur qui fixe ce délai d'attente pour que le service WCF rappel ses clients.

    Une autre solution pourrait être de stocker les images dans un dossier temporaire. Par exemple une vingtaine d'images temporaires.
    Le programme client met à jour un fichier de config ou il est inscrit le nom de la derniere image ( ex: image_178.jpg ).
    Un service web récupère cette info et fournis l'URL à l'application silverlight.
    Celle-ci n'a plus qu'a aller récupérer directement l'image. Ensuite pour être plus rapide l'application ira directement chercher les images en incrémentant le numero de l'image ( image_179...). Lorsqu'une erreur survient (url introuvable) on recontacte le service web ( par exemple on a reset le numéro des images)!

    Avantage: c'est le serveur HTTP qui travail le plus, mais c'est son job.
    Inconveniant : c'est un peu du bidouillage?

  12. #12
    Membre émérite
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Points : 2 682
    Points
    2 682
    Par défaut
    Peut etre peux tu optimiser ce que tu envoies : image en dégradé de gris, utilisation d'image clé et résolution plus petite.

Discussions similaires

  1. Appel d'un service web d'un autre site
    Par JinenSoftware dans le forum Services Web
    Réponses: 0
    Dernier message: 25/02/2009, 08h26
  2. [WCF] Appel d'un service windows WCF à partir de Php
    Par Interdit dans le forum Windows Communication Foundation
    Réponses: 10
    Dernier message: 21/04/2008, 10h18
  3. [C# 2.0] Appel dynamique de service Web
    Par thecrax dans le forum Services Web
    Réponses: 4
    Dernier message: 18/12/2007, 17h15
  4. appel d'un service web
    Par soumaa dans le forum Services Web
    Réponses: 2
    Dernier message: 28/04/2007, 21h16
  5. Appel d'un service Web
    Par REMACC1 dans le forum Access
    Réponses: 2
    Dernier message: 12/09/2006, 13h41

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