Announcement

Collapse
No announcement yet.

WCF Duplex Messaging

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

  • WCF Duplex Messaging

    Hallo,

    Ich habe ein kleinen WCF erstellt der mit event arbeitet.

    Ich habe auch noch ein paar Fragen:
    1. Ist die Web.Config nötig?
    2. später soll der Client local laufen und auf dem Server zugreifen in dem es Befehle wie Start, Stop, Status schickt.. sind WCF gut dafür geeignet oder gibt es eine einfacher Methode?

    Bei running der Client Seite bekomme Ich folgende Fehler:
    Es wurde kein standardmäßiges Endpunktelement gefunden, das auf den Vertrag "IMyContract" im ServiceModel-Clientkonfigurationsabschnitt verweist

    EventService Client
    Code:
    namespace WcfEventServiceClient
    {
        class EventServiceClient:DuplexClientBase<IMyContract>,IMyContract
        {
            public EventServiceClient(InstanceContext eventCntx)
                : base(eventCntx)
            {
    
            }
    
            public void DoSomethingAndFireEvent()
            {
                base.Channel.DoSomethingAndFireEvent();
            }
    
            public void SubscribeEvent()
            {
                base.Channel.SubscribeEvent();
            }
    
    
            static void Main(string[] args)
            {
                
                IMyEvents evnt = new MySubscriber();
                InstanceContext eventCntx = new InstanceContext(evnt);
    
                EventServiceClient proxy = new EventServiceClient(eventCntx);
                Console.WriteLine("Client subscribe the event from the service at {0} ", DateTime.Now.ToString());
                proxy.SubscribeEvent();
                Console.WriteLine("Client call operation wich will fire the event");
                proxy.DoSomethingAndFireEvent();
                Console.ReadLine();
            }
        }
    
        class MySubscriber : IMyEvents
        {
            public void Event1()
            {
                Console.WriteLine("Event is subscribed from the service at {0}",DateTime.Now.ToString());
            }
        }
    }
    Von Host Seite bekomme ich diese Fehler:

    Der Dienst "WcfEventService.MyPublisher" verfügt über keine Anwendungsendpunkte (keine Infrastrukturendpunkte). Dies kann folgende Ursachen haben: Es wurde keine Konfigurationsdatei für die Anwendung gefunden, in der Konfigurationsdatei wurde kein mit dem Dienstnamen übereinstimmendes Dienstelement gefunden oder im Dienstelement wurden keine Endpunkte definiert.

    WcfEventServiceHost

    Code:
    namespace WcfEventServiceHost
    {
        class Program
        {
            static void Main(string[] args)
            {
                Uri httpUrl = new Uri("http://localhost:8731/MyPublisher/");
                ServiceHost host = new ServiceHost(typeof(WcfEventService.MyPublisher), httpUrl);
                host.Open();
                Console.WriteLine("Service is Hosted at {0}", DateTime.Now.ToString());
                Console.WriteLine("Host is running.... Press key to stop the service. ");
                Console.ReadLine();
                host.Close();
            }
        }
    }
    Web.Config

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.serviceModel>
        <services >
          <service behaviorConfiguration="ServiceBehavior"
          name="WcfEventService.MyPublisher">
            <endpoint address="http://localhost:8731/MyPublisher"
            binding="wsDualHttpBinding" contract="WcfEventService.IMyContract">
              <identity>
                <dns value="localhost"/>
              </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding"
             contract="IMetadataExchange"/>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="ServiceBehavior">
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true "/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
    und eventServiceClient:

    Code:
        public interface IMyEvents
        {
            [OperationContract(IsOneWay = true)]
            void Event1();
        }
    
        [ServiceContract(CallbackContract = typeof(IMyEvents))]
        public interface IMyContract
    {
        [OperationContract]
        void DoSomethingAndFireEvent();
    
        [OperationContract]
        void SubscribeEvent();
    }
    
    namespace WcfEventServiceClient
    {
        class EventServiceClient:DuplexClientBase<IMyContract>,IMyContract
        {
            public EventServiceClient(InstanceContext eventCntx)
                : base(eventCntx)
            {
    
            }
    
            public void DoSomethingAndFireEvent()
            {
                base.Channel.DoSomethingAndFireEvent();
            }
    
            public void SubscribeEvent()
            {
                base.Channel.SubscribeEvent();
            }
    
    
            static void Main(string[] args)
            {
                
                IMyEvents evnt = new MySubscriber();
                InstanceContext eventCntx = new InstanceContext(evnt);
    
                EventServiceClient proxy = new EventServiceClient(eventCntx);
                Console.WriteLine("Client subscribe the event from the service at {0} ", DateTime.Now.ToString());
                proxy.SubscribeEvent();
                Console.WriteLine("Client call operation wich will fire the event");
                proxy.DoSomethingAndFireEvent();
                Console.ReadLine();
            }
        }
    
        class MySubscriber : IMyEvents
        {
            public void Event1()
            {
                Console.WriteLine("Event is subscribed from the service at {0}",DateTime.Now.ToString());
            }
        }
    }
    Danke

  • #2
    Hallo,

    hast du .net 4.0?

    Wenn ja siehe für deine Fragen
    Events and Callbacks
    A Developer's Introduction to Windows Communication Foundation 4

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

    Comment


    • #3
      nein .net 3.5

      Comment


      • #4
        Hallo,

        dann hast du leider noch mit den Konfiguratinsproblemen die laut Fehlermeldung(en) vorhanden sind zu kämpfen.

        Prüf mal in der Konfig ob auch alle Namespaces und Klassen richtig sind. Soweit ich mich noch erinnern kann war das ein häufiger Fehler.


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

        Comment


        • #5
          Ich habe jetzt die Web.Config ein bissien geändert und der Host erkennt es und es funktioniert!
          jedoch bei den Client bleibt das Program genau bei dieser Methode hängen. Ich habe versucht die Web.Config zu Kopieren in das Client ordner kein Erfolg
          Code:
          public EventServiceClient(InstanceContext eventCntx)
                      : base(eventCntx)
                  {
          
                  }
          mit der Fehler
          Es wurde kein standardmäßiges Endpunktelement gefunden, das auf den Vertrag "IMyContract" im ServiceModel-Clientkonfigurationsabschnitt verweist. Dies kann folgende Ursachen haben: Für die Anwendung wurde keine Konfigurationsdatei gefunden, oder im Clientelement wurde kein Endpunktelement gefunden, das diesem Vertrag entsprach.
          jetzt ist es die Gleiche Web.Config.. warum fuktioniert es bei den Host und nicht beim Client?

          Comment


          • #6
            Hallo,

            die Konfig für Host und Client sind 2 verschiedene. So wie es ausschaut ist der Konfig des Clients keine Endpunkt angegeben. Schau dir ev. auch den WCF Service Configuration Editor an.


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

            Comment


            • #7
              Hallo,
              Danke für die Tipps
              Zuletzt editiert von foufou; 22.11.2010, 13:20.

              Comment


              • #8
                Hallo,

                Ich bin an den Punkt angekommen wo ich meine Daten in die Client Konsole eingebe,
                und die Daten werden auf der Host Konsole ausgegeben.
                Wie kann ich jetzt auf diese Daten zugreifen um es weiter zu verarbeiten?
                Ich Habe eine Methode getSayHello definiert in mein Service, mit host.getSayHello wurde es nicht funktionieren?
                und was es wenn ich jetzt an den Client Daten vom Host aus zurück schicke (der Host spielt jetzt dir Rolle von Client)?
                Ich bin dankbar für eure Hilfe.

                Comment


                • #9
                  Hallo,

                  siehe ersten Link oben. Der einzige Unterschied ist dass dort nicht auf die Konfiguraiton eingegangen wird.

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

                  Comment


                  • #10
                    auf den Host "Server seite" siehe ich in alle Beispiele
                    Code:
                     host.Open();
                        Console.WriteLine("Service is available. " +
                          "Press <ENTER> to exit.");
                        Console.ReadLine();
                        host.Close();
                    Ich erkenne aber nicht wie ich auf die angezeigte Daten auf den Host Console zugreifen könnte?

                    Comment


                    • #11
                      Hallo,

                      dieses Schnippsel zeigt ja nur wie der Service-Host gestartet wird. Die eigentliche Arbeit des Service erledigt ja die Sevice-Klasse. Und dort kannst die wie mit jeder anderen .net-Methode auch mit den Argumenten arbeiten bzw. mit der Klasse als normales Objekt.

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

                      Comment


                      • #12
                        Ich denke ich verstehe immer noch nicht den Konzept

                        Wenn ich mit den Service als normale Object arbeiten kann,
                        dann kann ich mein Service Klasse aus den Host Starten
                        wie folgt:

                        Code:
                                    host.Open();
                                    Thread.CurrentThread.Name = "Main";
                                    controller = new ProcessController();
                                    w = new Thread(controller.StartProcess);
                                    w.Start(true);
                        Aber jetzt müsste ich aus den Client auf den gleichen Service Instance zugreifen den ich aus mein Host davor initialisiert und gestartet habe,
                        "Client Seite":
                        Code:
                        proxy.Status()
                        bei der Methode Status im Service Klasse wird eine NullReferenceException ausgelöst.
                        MFG
                        Zuletzt editiert von foufou; 06.12.2010, 11:59.

                        Comment

                        Working...
                        X