Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

WCF in WPF Anwendung hosten - TimeOut bei interner Kommunikation - Externe Kommunikation problemlos.
JHeck
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

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

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von JHeck am .
Attachments
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Hallo
Zitat von JHeck
Hab euch das Beispiel einfach mal angehängt.

Keine gute Idee - poste lieber relevante Code-Ausschnitte.
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
JHeck
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

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*
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Zitat von JHeck
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.
Zitat von JHeck
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ujr am .
private Nachricht | Beiträge des Benutzers
JHeck
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

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));
         }

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von JHeck am .
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers