Zum Inhalt springen

WCF - Verbindung über Internet


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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 :D

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

    }

Geschrieben (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 von Blackodem
Geschrieben

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.

Geschrieben

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

Geschrieben

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!

Geschrieben (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 von Blackodem
Geschrieben (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 von uenetz
Geschrieben

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.

Geschrieben

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

Geschrieben (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 von lbm1305AtWork
Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...