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

ASP.NET Discussion :

Client ASP.NET effectuant des appels asynchrones vers un service WCF


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 215
    Points : 71
    Points
    71
    Par défaut Client ASP.NET effectuant des appels asynchrones vers un service WCF
    Bonjour à tous,

    J'ai créé un service WCF des plus basique.

    IHelloWorldServiceCallback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [ServiceContract]
    public interface IHelloWorldServiceCallback
    {
        [OperationContract(IsOneWay = true)]
        void sayHelloResultCallback(string message);
     
        [OperationContract(IsOneWay = true)]
        void sayHelloFailureCallback(Exception e);
    }
    IHelloWorldService
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [ServiceContract(CallbackContract=typeof(IHelloWorldServiceCallback))]
    public interface IHelloWorldService
    {
        [OperationContract(IsOneWay=true)]
        void sayHello();
    }
    HelloWorldService
    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
    public class HelloWorldService : IHelloWorldService
    {
        public void sayHello()
        {
            IHelloWorldServiceCallback callback = OperationContext.Current.GetCallbackChannel<IHelloWorldServiceCallback>();
     
            try
            {
                callback.sayHelloResultCallback("Hello World");
            }
            catch (Exception e)
            {
                callback.sayHelloFailureCallback(e);
            }
        }
    }
    J'essaie de créer un client web pour ce service.
    J'ai créé une page aspx en y insérant un seul label ayant l'ID "Label1".

    Voici le code de ma page aspx.cs
    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
    public partial class _Default : System.Web.UI.Page, IHelloWorldServiceCallback
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            HelloWorldServiceClient service = new HelloWorldServiceClient(new InstanceContext(this));
            service.sayHello();
        }
     
        public void sayHelloFailureCallback(Exception e)
        {
            Label1.Text = e.Message;
        }
     
        public void sayHelloResultCallback(string message)
        {
            Label1.Text = message;
        }
    }
    Mon problème est que mon label reste toujours vide alors que le système passe bien par la méthode "sayHelloResultCallback". (je l'ai testé avec un point d'arrêt)

    D'ou vient ce problème ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Si l'appel à sayHelloResultCallback est asynchrone peut être que lors de l'appel ta page a déjà été renvoyée au client (surement même) ? (j'écris au conditionnel car je ne connais pas WCF et je ne vois pas où il se passe qque chose d'asynchrone)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 215
    Points : 71
    Points
    71
    Par défaut
    N'est-il pas possible de renvoyer des informations au client grâce à Ajax une fois la page chargée ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Là encore je ne maîtrise pas Ajax mais je ne crois pas que ce soit fait pour maintenir une connexion ouverte entre le client et le serveur afin d'envoyer des données au client. C'est plutôt fait pour l'inverse, à partir d'une action de l'utilisateur émettre une requête au serveur pour mettre à jour des contrôles et pas toute la page.
    Par exemple avec Ajax tu pourrais à intervalle régulier demander le résultat de ta requête au serveur pour mettre à jour ton label qd la réponse est arrivée.

    Qu'un expert ajax me corrige si je dis des bêtises .

  5. #5
    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 ToxiZz Voir le message
    N'est-il pas possible de renvoyer des informations au client grâce à Ajax une fois la page chargée ?
    Pourquoi veut-tu recharger la page ? Ajax s'est fait justement pour ne pas la recharger.
    Tu appelles ton service en javascript et tu mets à jour ta page via javascript quand tu as la réponse. Tout est fait en asynchrone.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 215
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par The_badger_man Voir le message
    Tu appelles ton service en javascript et tu mets à jour ta page via javascript quand tu as la réponse. Tout est fait en asynchrone.
    Merci pour ta réponse. J'ai vu quelques tutoriels montrant cette technique, mais j'essaie d'arriver au même résultat sans passer par du javascript. Le problème du JavaScript c'est que si je veux remplir une dataGrid, dataList, repeater, ... ce n'est pas possible.

    Voici mon deuxième essai, sans succès :

    default.aspx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
     
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:Label ID="Label1" runat="server" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </form>
    default.aspx.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    protected void Page_Load(object sender, EventArgs e)
    {
        MyServices.HelloWorldServiceClient client = new MyServices.HelloWorldServiceClient();
        client.BeginsayHello(new AsyncCallback(SayHelloCallback), client);
    }
     
    private void SayHelloCallback(IAsyncResult ar)
    {
        string message = ((MyServices.HelloWorldServiceClient)ar.AsyncState).EndsayHello(ar);
     
        Label1.Text = message;
        UpdatePanel1.Update();
    }
    N'est-ce pas possible de passer par un updatePanel pour rafraichir une partie de la page de manière asynchrone ?

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Si c'est possible mais tu persistes à pas comprendre un point important: ça doit partir d'une action du client ! A aucun moment le serveur peut de son initiative attaquer le client en http.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 215
    Points : 71
    Points
    71
    Par défaut
    Donc je ne sais rien lancer de manière "client" au chargement de ma page ?

Discussions similaires

  1. [ASP.net] Héberger des images hors de mon site
    Par Rodie dans le forum Gratuit
    Réponses: 3
    Dernier message: 17/08/2007, 12h23
  2. [Nhibernate & ASP.NET] Utilisation des Users
    Par anthyme dans le forum NHibernate
    Réponses: 1
    Dernier message: 17/07/2007, 23h05
  3. Liste des clients pouvant encore effectuer des commandes
    Par julie75 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 04/07/2007, 15h49
  4. [ASP.NET] Gestion des page WEB par IIS
    Par pc152 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 20/06/2007, 11h06
  5. Importer via asp.net c# des variables dans mon namespace xsl
    Par akaii dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/01/2006, 08h41

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