Announcement

Collapse
No announcement yet.

WCF Server-Call (KEIN CALLBACK)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WCF Server-Call (KEIN CALLBACK)

    Hallo Zusammen,

    ich habe mir eine Server-Client-Umgebung aufgebaut mit WCF. Das funktioniert wunderbar. Allerdings möchte ich jetzt vom Server an die Clients in bestimmten Intervallen Daten versenden, die auf den Clients eine Ansicht aktualisieren soll.

    Auf den Clients ist also eine Ansicht von einer Anzahl Gästen die sich im Hause befinden. (Ich weiß, warum nicht einfach in Datenbank und dann auslesen?. Durch interne Richtlinien nicht möglich, warum? ==> Isso.)

    Die vorhandene Client-Server-Verbindung möchte ich so bestehen lassen.

    Also meine Frage:
    Wie kann ich mit WCF einfach nur einen Call an die Clients senden?

    Ich habe nur Beispiele für einen Callback im Internet gefunden.

    Ich möchte vermeiden einen zweiten Channel mit Callback-Funktionen aufzurufen!

    Der Aufbau meines Server-Clients ist nach folgender Intenet-Seite aufgebaut: WCF Tutorial - Basic Interprocess Communication

    [highlight=csharp]
    using System;
    using System.ServiceModel;
    using GaesteServer.Globals;
    using GaesteServer.Interfaces;
    using GaesteServer.Properties;

    namespace GaesteServer.Listener
    {
    public class StartListener
    {
    private ServiceHost _host;
    private Uri _uri;

    public void Listener_Start()
    {
    try
    {
    var sets = new Settings();

    string uriString = "http://" + sets.ListenerConnection.Trim() + ":" + sets.ListenerPort.Trim();
    _uri = new Uri(uriString);

    _host = new ServiceHost(typeof(DataAcquisition), _uri);
    _host.AddServiceEndpoint(typeof(IDataAcquisition), new BasicHttpBinding(), "Reverse");
    _host.Open();
    }
    catch (Exception ex)
    {
    SchreibeInDatei.Fehler(ex.Message);
    }
    }

    public void Listener_Stop()
    {
    if (_host != null) _host.Close();
    }

    }
    }

    [/highlight]

    Vielen Dank für Eure Unterstützung

    Gruß Lerando
    Zuletzt editiert von gfoidl; 10.07.2012, 10:40.

  • #2
    Hallo,

    bei HTTP gehts nur wenn der Server und der Client die Rollen tauschen, also mit einer zweiten Verbindung für das Callback.
    Du könntest auf TCP-Verbindungen umstellen, sofern möglich. Wenn jedoch ein Server an viele Clients die Gleiche Meldung senden soll, so wäre ein UDP-Broadcast ev. vorteilhafter, da nicht mit jedem Client eine Verbindung bzw. ein expliziter Nachrichtenaustausch nötig ist.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Danke für die rasche Antwort. Leider bin ich auch in diesem Gebiet Anfänger.

      Hättest Du vielleicht einen Link der auch für Anfänger geeignet ist.

      Gruß Lerando

      Comment


      • #4
        Hallo,

        ist dieser Link brauchbar?

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          (**GRINS**) So weit bin ich auch schon gekommen. Vieeeelen Dank. Das habe ich verdient.

          Aber, wie sieht es aus, wenn ich anstatt die BasicHttpBinding ein NetTcpBinding verwende?

          [highlight=csharp]
          ....
          public void Listener_Start()
          {
          try
          {
          var sets = new Settings();

          string uriString = "http://" + sets.ListenerConnection.Trim() + ":" + sets.ListenerPort.Trim();
          string uriStringNetTcp = "net.tcp://" + sets.ListenerConnection.Trim() + ":" + sets.ListenerPort.Trim();
          _uri = new Uri(uriStringNetTcp);//(uriString);

          _host = new ServiceHost(typeof(DataAcquisition), _uri);
          _host.AddServiceEndpoint(typeof(IDataAcquisition), new NetTcpBinding()/*BasicHttpBinding()*/, "Reverse");
          _host.Open();


          }
          catch (Exception ex)
          {
          SchreibeInDatei.Fehler(ex.Message);
          }
          }
          ....
          [/highlight]

          Kann ich dann auch ein eigenes Interface für denselben Port benutzen, der schon angemeldet ist?

          Soweit ich im Internet nachgelesen habe, kann ich hier nur ein Callback auf das Hauptinterface setzen, dass dann einfach eine Return-Message an den Sender zurückgibt.

          Ich möchte jedoch, dass der Client nicht aktiv auf den Server erst zugreifen muss, sondern wie oben beschrieben, der Server aktiv an die Clients sendet.

          Ist dass mit WCF überhaupt möglich, ohne einen zweiten Channel zu öffnen?

          Gruß Lerando
          Zuletzt editiert von Lerando; 10.07.2012, 13:48.

          Comment


          • #6
            Hallo,

            Ist dass mit WCF überhaupt möglich, ohne einen zweiten Channel zu öffnen?
            In WCF gehts das nur über Callbacks. Siehe WCF Tutorial - Events and Callbacks | Switch on the Code.

            Ich möchte jedoch, dass der Client nicht aktiv auf den Server erst zugreifen muss, sondern wie oben beschrieben, der Server aktiv an die Clients sendet.
            Das geht afaik nur mittels UPD-Broadcast. Sonst ist immer eine status-behaftete Verbindung notwendig.

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Originally posted by gfoidl View Post
              Das geht afaik nur mittels UPD-Broadcast. Sonst ist immer eine status-behaftete Verbindung notwendig.
              Na ja, ganz korrekt ist das wohl nicht, hier ein Link, den ich noch gefunden habe, wie es mit WCF doch noch funktioniert. (Ich glaub ich mach nen Google-Kurs). Allerdings ist hier dennoch ein Windows-Dienst für eine Art "Anmeldung" des Clients notwendig.
              WCF-Duplex zwischen Windows Sevice und GUI-Frontend

              Vielen Dank für Deine Unterstützung. Das hat mich ziemlich schnell weitergebracht.

              Gruß Lerando
              Zuletzt editiert von gfoidl; 11.07.2012, 13:01. Reason: Link-Namen bearbeitet

              Comment


              • #8
                Hallo,

                im Link wird aber auch ein Callback verwendet. Eine zweite explizite Verbindung ist hier jedoch nicht notwendig, da NamedPipes als Verbindung verwendet werden. Das ginge mit TCP als Verbindung auch. Bei HTTP muss prinzipbedingt eine zweite Verbindung aufgebaut werden.
                Jedenfalls muss hier der Server jeden Client per Callback informieren. Bei einem Broadcast reicht dem Server eine Meldung ins Netz und alle Clients die zuhören bekommen diese Meldung mit.

                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  Hy,

                  super Info. Danke.

                  Ich habe aber noch etwas entdeckt und zwar kann über HTTP auch ein Callback durchgeführt werden. Es muss nur mit WSDualHttpBinding der Endpoint gesetzt sein.

                  http://msdn.microsoft.com/en-us/library/ms586909

                  Gruß Lerando

                  Comment


                  • #10
                    Hallo,

                    mir ist das schon klar ;-) aber du hast im Themen-Titel ja stehen "KEIN CALLBACK", da es auch noch hervorgehoben wurde, habe ich das nicht erwähnt.

                    Wenn du mit Callbacks arbeiten willst, so muss sich jeder Client beim Server registrieren und der Server muss dann jeden Client in seiner Registriert-Liste separat durchgehen um die Meldung zum Client zu senden. Die Clients müssen sich auch deregistrieren. Fehlerbehandlung muss auch eingebaut werden. Damit das alles korrekt funktioniert ist schon etwas Aufwand zu betreiben.

                    Beim UDP-Broadcast sendet der Server hingegeben nur die Nachricht aus und der Rest ist ihm egal. Die Clients können, nachdem sie den Broadcast erhalten haben, dann normal per WCF mit dem Server kommunizieren.

                    Was du jetzt verwendest musst du entscheiden. Ich will dich zu nichts drängen, nur Aufzeigen worauf du achten musst.

                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      Hy,

                      Du hast mir sehr geholfen und ich Danke Dir dafür. Natürlich finde ich, wie Du, dass das UDP Broadcast das bessere ist. Allerdings finde ich (als Anfänger) das Thema spannend und habe sozusagen meinen "Senf" dazu gegeben.

                      Deine Antworten sind perfekt.

                      Gruß Lerando

                      Comment

                      Working...
                      X