Laden...

WCF in WPF Anwendung hosten - TimeOut bei interner Kommunikation - Externe Kommunikation problemlos.

Erstellt von JHeck vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.019 Views
J
JHeck Themenstarter:in
3 Beiträge seit 2011
vor 13 Jahren
WCF in WPF Anwendung hosten - TimeOut bei interner Kommunikation - Externe Kommunikation problemlos.

Hallo zusammen,

ich hab ein kleines Problem, das mir so bis dato nicht aufgetreten ist.
Hab euch das Beispiel einfach mal angehängt.

WpfApplication1
Ich hoste einen WCF Service in einer WPF Anwendung - das ist an für sich nichts besonderes. Nun möchte ich nach erfolgreichem öffnen des Hosts direkt eine Funktion von diesem nutzen - und zwar direkt in der hostenden WPF Anwendung. (z.B. um dem Service spezielle Konfigurationsdaten zu übergeben)

Das Problem: egal wie ich versuche den WCF Service aus der WPF Anwendung aufzurufen kommt es IMMER zu einen TimeOut oder anderen Fehlern. Von "Außerhalb" als einer 2. Anwendung funktioniert der Zugriff, sowie über den InternetExplorer tadellos.

ConsoleApplication1
Das Irre ist, dass ich das gleiche Szenario schon zig mal mit WindowsDiensten und ConsolenApplikationen problemlos umgesetzt habe (Dazu das 2. Beispiel) - nur im Fall der WPF Anwendung bin ich mit meinem Latein am Ende.

Habt ihr mir eventuelle eine Idee?
Herzlichen Dank
Joachim

G
538 Beiträge seit 2008
vor 13 Jahren

Schon mal geprüft, ob evtl. 64Bit kompiliert wird und das Probleme macht?

Ansonsten könntest du zum Debuggen auch mal per NetMon oder Fiddler in deinen Datenverkehr schauen, was da so passiert ...

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

U
1.688 Beiträge seit 2007
vor 13 Jahren

Hallo

Hab euch das Beispiel einfach mal angehängt.

Keine gute Idee - poste lieber relevante Code-Ausschnitte.

G
538 Beiträge seit 2008
vor 13 Jahren

Ich habe mal in den Code reingeschaut und konnte - interessanterweise wie ich finde - das Problem reproduzieren.

Mal abgesehen davon, dass du eventuell das Open des ServiceClients nicht im Konstruktor des Windows machen solltest, finde ich am Service selbst nichts komisch.
ABER ich muss dennoch fragen, warum du einen Service den du in deiner Applikation hostest aus deinem Service heraus abfragen möchtest? Ein Aufruf der DLL wäre sicherlich einfacher, effizienter und weniger aufwändig.

Des weiteren könntest du eine Service Reference benutzen anstatt nur die ChannelFactory - dann bekommt dein Client auch eine eigene Konfiguration.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

J
JHeck Themenstarter:in
3 Beiträge seit 2011
vor 13 Jahren

Wow, danke schon mal euren Antworten 😃

ujr - Ich hab keine Codeausschnitte eingefügt, weil hier ja mehrere Komponenten miteinander interagieren. Zudem ist eine vollständige App.config etc... sicherlich wenig hilfreich - deswegen hab ich das CodeBeispiel gewählt.

Grumbler85 - normalerweise würde ich das auch ganz genau so machen wie du sagst - mittels Bibliotheken. In dem Fall muss ich jedoch einen Simulationsumgebung für eine Reihe WCF Services schaffen, mit denen die Interaktion mit einem Client simuliert werden kann.
Das heißt meherere Services kommunizieren untereinander und schicken das Ergebnis an den Client. Dazu gibt es eine fancy Oberfläche mit der man das Verhalten der Services steuern kann. Also eine Testumgebung, als ein kleines handliches und hübsches Programm 😉

Das ist echt seltsam mit dem WPF Teil - in der Consolenapplikation und WindowsService läufts ja schließlich auch. HAb den Test jetzt auch noch mit einer WinForms Applikation gemacht --> Selbes Ergebnis: TimeOut.

Ich mach da jetzt schon die letzten Tage rum und komm einfach nicht weiter.
*kopfschüttel*

U
1.688 Beiträge seit 2007
vor 13 Jahren

Ich hab keine Codeausschnitte eingefügt, weil hier ja mehrere Komponenten miteinander interagieren. Zudem ist eine vollständige App.config etc... sicherlich wenig hilfreich - deswegen hab ich das CodeBeispiel gewählt.

s. [Hinweis] Wie poste ich richtig? 4.1

Es geht um relevante Code-Ausschnitte - z. B. wo und wie der ServiceHost erzeugt wird, wo und wie Daten gelesen werden... Üblicherweise hat kaum jemand Lust ein Projekt herunterzuladen, zu entpacken, zu starten. Die Chance auf hilfreichen Antworten sinkt.
Edit: Das siehst Du übrigens sehr schön am Verhältnis von Views und Downloads. Es ist also Deine Aufgabe, und nur zu Deinem Vorteil, Dir Gedanken zu machen, was relevant ist.

Das ist echt seltsam mit dem WPF Teil - in der Consolenapplikation und WindowsService läufts ja schließlich auch. HAb den Test jetzt auch noch mit einer WinForms Applikation gemacht --> Selbes Ergebnis: TimeOut.

Ein Unterschied zumindest ist offensichtlich: WPF/Windows Forms haben einen GUI-Thread. Also würde ich mal die angesprochenen Punkte (Erzeugen und Senden) vom GUI-Thread entkoppeln, falls Du das noch nicht getan hast.

J
JHeck Themenstarter:in
3 Beiträge seit 2011
vor 13 Jahren

Ich verneige mein Haupt - der GUI Thread wars. Manchmal sieht man den Wald vor lauter Bäumen nicht mehr 😉

Vielen vielen Dank!

Die relevanten Anpassungen:



  Boolean isRunning = true;

        public MainWindow()
        {
            InitializeComponent();

            Thread HostingThread = new Thread(hosting);
            HostingThread.IsBackground = true;
            HostingThread.Start();
        }


        void hosting()
        {
            serviceHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1));
            serviceHost.Opened += new EventHandler(serviceHost_Opened);
            serviceHost.Open();

            while(isRunning)
                Thread.Sleep(1000);
        }

        void serviceHost_Opened(object sender, EventArgs e)
        {
                WcfServiceLibrary1.IService1 serviceInstance = ChannelFactory<WcfServiceLibrary1.IService1>.CreateChannel(
                    new BasicHttpBinding(BasicHttpSecurityMode.None),
                    new EndpointAddress(serviceHost.BaseAddresses.First())); 
            
                MessageBox.Show(serviceInstance.GetData(12312));
         }


849 Beiträge seit 2006
vor 13 Jahren

Schade zu spät, aber um das ganze nochmal zu präzisieren:

Der Konstruktor von MainWindow wird nie mehr verlassen, da du ihn mit Open() veranlasst auf eingehende Connections zu horchen. Und somit steht der GUI Thread, und die MessageBox kann nie angezeigt werden.