Blackodem Geschrieben 11. Januar 2013 Geschrieben 11. Januar 2013 Hallo Informatiker Kollegen, ich schreibe momentan eine WPF Anwendung die an einen WCF Service gekoppelt ist. Der WCF Service wird in einer Konsolenanwendung gehostet. Soweit alles gut, funktioniert auch auf dem Rechner (Server und Client auf dem selben Rechner). Ich möchte den Server nun aber Testweise auf meinen Webserver auslagern und den Client mit dem WCF auf dem Webserver verbinden. Ich benutze HTTP und habe den Endpoint vom WCF auf folgende URL angepasst http://0.0.0.0:8090/ERPTracker_Service/ClientService, damit ich ihn von außen erreichen kann. Funktioniert im localhost immer noch klasse. Wenn ich den Service jetzt allerdings auf dem Webserver schmeiße und versuche mich mittels Domain oder IP mit dem Service zu verbinden, funktioniert das nicht. Der Port ist freigegeben und wenn ich in der Browserzeile "http://IPVOMSERVER:8090/ERPTracker_Service/ClientService" eingebe, bekomme ich sogar eine Infoseite vom Service, kann sich da jemand erklären warum das mit dem Client nicht funktioniert? der Endpoint vom Client ist natürlich auch angepasst. Ich freu mich auf Antworten Zitieren
uenetz Geschrieben 12. Januar 2013 Geschrieben 12. Januar 2013 Mit den Informationen die der Threadersteller geliefert hat, kann ich nur auf folgendes tippen: 1. Port ist mit Firewall geblockt. 2. Programmierfehler. Mehr lässt sich aus dem Kontext nicht rausziehen Zitieren
Blackodem Geschrieben 12. Januar 2013 Autor Geschrieben 12. Januar 2013 Hallo, danke schon mal für die Antwort Der Port ist auf dem Server freigegeben und ein Programmierfehler ist definitiv möglich, da das mein erster Gehversuch mit WCF ist, aber Versuch macht kluch Kann ich dir denn noch irgendwelche Informationen liefern? Was brauchst du? Ich hänge hier einmal den Code vom WCF an, ich habe ihn direkt programmseitig konfiguriert und nicht über die App.Config. Fehlt da vielleicht noch ein Endpoint zum Metadaten-Austausch? Wie gesagt auf dem lokalen System funktioniert es. static void Main(string[] args) { // Url erstellen (HTTP) Uri lUrl = new Uri("http://0.0.0.0:8090/ERPTracker_Service/ClientService"); // ServiceHost erstellen ServiceHost lServiceHost = new ServiceHost(typeof(service.clientservice.ClientService), lUrl); // ServiceEndpoint hinzufügen (HTTP) WSHttpBinding lBinding = new WSHttpBinding(); lServiceHost.AddServiceEndpoint(typeof(service.clientservice.IClientService), lBinding, ""); //Enable metadata exchange ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; lServiceHost.Description.Behaviors.Add(smb); lServiceHost.Open(); Console.WriteLine("Service is host at " + DateTime.Now.ToString()); Console.WriteLine("Host is running... Press <Enter> key to stop"); Console.ReadLine(); } Zitieren
uenetz Geschrieben 12. Januar 2013 Geschrieben 12. Januar 2013 Da habe ich gleich mal eine Frage! Du machst ein Open .... und danach ???? Ich denke mal, dass dies nicht der Quelltext ist, den Du in der App nutzt, oder ? Zitieren
Blackodem Geschrieben 12. Januar 2013 Autor Geschrieben 12. Januar 2013 (bearbeitet) Stimmt, da hab ich das close vergessen das würde unten noch dran kommen. Ne ich hab in der WPF eine ServiceReference erstellt und bau mir aber in nem Loginfenster den Endpunkt selbst zusammen, also je nachdem was der User für eine IP und einen Port eingibt, ich weiß ist bestimmt nicht die gelbe vom Ei, aber ich hab mich mit dem Proxy generieren sehr schwer getan und bin dann auf die ServiceReference umgestiegen. Wie gesagt, WCF war bis jetzt immer ein Buch mit sieben Siegeln für mich, bitte nachsichtig sein Bearbeitet 12. Januar 2013 von Blackodem Zitieren
lbm1305 Geschrieben 14. Januar 2013 Geschrieben 14. Januar 2013 Wie sieht der Code / der Aufruf im Loginfenster aus? Zitieren
SilentDemise Geschrieben 15. Januar 2013 Geschrieben 15. Januar 2013 0.0.0.0 ist als ip adresse aber auch selten dämlich gewählt. Zitieren
Blackodem Geschrieben 15. Januar 2013 Autor Geschrieben 15. Januar 2013 Im Loginfenster lass ich den User eine IP und einen Port eingeben und bau mir dann den Endpunkt zusammen ClientService.ClientServiceClient lClient = new ClientService.ClientServiceClient(); lClient.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://" + AppInfo.ServerIP + ":" + AppInfo.ServerPort + "/ERPTracker_Service/ClientService"); Ich hatte sonst anstelle von 0.0.0.0 auch localhost, bzw. die Domain/IP meines Webservers, aber ich habe gelesen das 0.0.0.0 bedeutet das er dann auf alles hört was kommt und, da es nicht funktioniert hat, habe ich dann diese Adresse ausprobiert. Zitieren
SilentDemise Geschrieben 15. Januar 2013 Geschrieben 15. Januar 2013 0.0.0.0 - Wikipedia, the free encyclopedia Zitieren
Blackodem Geschrieben 15. Januar 2013 Autor Geschrieben 15. Januar 2013 Danke, dann sollte ich das das wirklich mal ändern, aber welche Adresse würde man denn angeben, damit der WCF auf alle Adressen horcht, sodass man das nicht immer für jeden Server anpassen muss? Und wenn ich anstatt 0.0.0.0 die Ip des Servers angegeben habe, hat es auch nicht funktioniert, da muss ja dann noch irgendwas im Busch sein Zitieren
uenetz Geschrieben 15. Januar 2013 Geschrieben 15. Januar 2013 Frage in Deiner Applikation ab, welche IP-Adresse eth0 hat und setze diese dann beim Aufbau des Server-Socket. So lange Du nicht mit einem brauchbaren Quelltext die Anfrage stellst, wird Dir auch niemand weiter helfen können/wollen. Man macht aus einem Forum einfach kein Quizz! Zitieren
Blackodem Geschrieben 15. Januar 2013 Autor Geschrieben 15. Januar 2013 (bearbeitet) Das ist eine gute Idee danke. Was soll ich denn noch dazu packen, es ist der Code vom Service da und der Code vom Client, was wird noch gebraucht? Server: static void Main(string[] args) { // Url erstellen (HTTP) Uri lUrl = new Uri("http://localhost:8090/ERPTracker_Service/ClientService"); // ServiceHost erstellen ServiceHost lServiceHost = new ServiceHost(typeof(service.clientservice.ClientService), lUrl); // ServiceEndpoint hinzufügen (HTTP) WSHttpBinding lBinding = new WSHttpBinding(); lServiceHost.AddServiceEndpoint(typeof(service.clientservice.IClientService), lBinding, ""); //Enable metadata exchange ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; lServiceHost.Description.Behaviors.Add(smb); lServiceHost.Open(); Console.WriteLine("Service is host at " + DateTime.Now.ToString()); Console.WriteLine("Host is running... Press <Enter> key to stop"); Console.ReadLine(); } Client: ClientService.ClientServiceClient lClient = new ClientService.ClientServiceClient(); lClient.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://" + AppInfo.ServerIP + ":" + AppInfo.ServerPort + "/ERPTracker_Service/ClientService"); bool lbVerbindung = lClient.TestConnection(); Bearbeitet 15. Januar 2013 von Blackodem Zitieren
uenetz Geschrieben 15. Januar 2013 Geschrieben 15. Januar 2013 (bearbeitet) Damit man lokalisieren kann, wo es klemmt, würde ich empfehlen alles zu posten, was mit der Sache zu tun hat. Aber das mit dem Ermitteln der Server-IP finde ich persönlich nicht so gut. Es gibt Serversysteme, die a. mehrere NIC's besitzen, b. Dienste sollen nur auf bestimmten Interfaces zur Verfügung gestellt werden, etc. Erstelle besser eine Konfgurationsdatei für den Dienst, in dem Du alle notwendigen Parameter setzt. Zusatz: Helfen kann auch, wenn man den Quelltext akribisch dokumentiert! Bearbeitet 15. Januar 2013 von uenetz Zitieren
SilentDemise Geschrieben 15. Januar 2013 Geschrieben 15. Januar 2013 Services ruft man über URLs auf, nicht über IPs. Zitieren
uenetz Geschrieben 15. Januar 2013 Geschrieben 15. Januar 2013 Ohhhh ... und ich dachte seit jahrzehnten, daß Adressierung im Internet primär über die IP-Adressen läuft, und DNS ein zusätzlicher Service ist. *zwinker. Nichts desto trotz muss ein Serverdienst ja auf einem Socket horchen u.s.w. Zitieren
uenetz Geschrieben 15. Januar 2013 Geschrieben 15. Januar 2013 Frage: Du öffnest einen Kanal, gibst auf der Konsole 2 Strings aus und erwartest dann einen String als Eingabe. WAS folgt danach? Zitieren
Blackodem Geschrieben 15. Januar 2013 Autor Geschrieben 15. Januar 2013 Das Readline ist nur dafür da, damit sich der Service nicht beendet. Sobald der User eine Taste drückt, wird der Service beendet, da fehlte noch das lServiceHost.Close(); unten dran. Ich habe mich bei dem Aufbau an dieses Tutorial gehalten: WCF tutorial Zitieren
lbm1305AtWork Geschrieben 15. Januar 2013 Geschrieben 15. Januar 2013 (bearbeitet) Zum Ersten würde ich bei der Konfiguration erstmal zurück auf BasicHttpBinding gehen. Bisher sehe ich ich der Konfiguration keine Grund, welcher WSHttpBinding rechtfertigt. Zweitens, kannst Du die komplette Url des WCF-Service posten? Kann auch eine für Testzwecke angelegte Webseite auf dem IIS sein. Bearbeitet 15. Januar 2013 von lbm1305AtWork Zitieren
Blackodem Geschrieben 15. Januar 2013 Autor Geschrieben 15. Januar 2013 Danke für den Tipp, ich bin gerade zurück auf das BasicHttpBinding und da funktioniert es, es scheint Probleme mit der Authentifizierung gegeben zu haben, die mit dem BasicBinding jetzt erstmal gelöst sind Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.