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

  • »
  • Community
  • |
  • Diskussionsforum
Wie mache ich einen WCF Service extern zugänglich?
Prot
myCSharp.de - Member

Avatar #avatar-3487.jpg


Dabei seit:
Beiträge: 5
Herkunft: Schland

Themenstarter:

Wie mache ich einen WCF Service extern zugänglich?

beantworten | zitieren | melden

Hallo,

ich bin neu in dem Thema deshalb sagt mir bitte Falls ich nicht alle nötigen Informationen zu meiner Frage angebe. Außerdem verstehe ich vielleivht nicht alle Zusammenhänge zu 100%

Folgendes Szenario:

Man hat mich gebeten einen WCF-Diesnt einzurichten der ein Paar Methoden zur Verfügung stellt. Das habe ich getan. Am ende kam eine Adresse (http://foo/webservices/barService.svc) raus unter der man den svcutil.exe Befehl zum generieren einer .cs und einer .config-Datei bekommt, alles ok. Innerhalb unseres Netzwerks kann man ohne Probleme darauf zugreifen und konsumieren.

Dann sollte der Diesnt auch für externe Partner zugänglich gemacht werden. Hier hat mein KnowHow aufgehört. Kollegen haben aber wohl beim Netzanbieter für den Dienst einen DNS-Eintrag tätigen lassen (http//Foo.de/webservices/Bar.svc). Diese Adresse habe ich an die externen Kollegen (C#-Entwickler) weiter geleitet, und anscheinend können sie darauf zugreifen. Naja solange die Kollegen darauf zugreifen konnten war das auch ok.

Dann kam ein weiterer externer Kollege hinzu der auf den Dienst zugreifen wollte. Dieser benutzt aber PHP unter Ubuntu. Der scheint nun schon Probleme zu haben den Diesnt zu konsumieren. Aber auch ich selbst habe Probleme auf diese Adresse zuzugreifen WCFStorm bringt die Meldung:
Endpoint is invalid. Make sure that the service has an exposed MEX (wsdl) endpoint.

Die developer-Konsole sagt:
Dateien werden generiert...
Warnung: Es wurde kein Code generiert.
Wenn Sie versucht haben, einen Client zu generieren, könnte die Ursache hierfür
sein, dass die Metadatendokumente keine gültigen Verträge oder Dienste enthielten
oder dass erkannt wurde, dass sich alle Verträge/Dienste in /reference-Assemblys
 befinden. Stellen Sie sicher, dass alle Metadatendokumente an das Tool übergeben wurden.

Warnung: Wenn Datenverträge aus Schemas generiert werden sollen, müssen Sie sich
erstellen, dass die Option /dataContractOnly verwendet wird.

Ich kann mit beidem sehr wenig anfangen. Falls noch zusätzliche Infos nötig sind, ich habe auch das Tracing für den Dienst aktiviert.

Kann mir da einer Helfen?

Danke im Voraus.
http://pressbit.wordpress.com/about/
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

Nicht jedes WCF Binding kann von nicht-.NET Anwendungen konsumiert werden.
Ist es jedoch ein normales HTTP Binding, wie es sich anhört, dass sollte ein PHP-Client damit keine Probleme haben.

Beim Thema Technologie-Unabhängigkeit ist jedoch ein RESTful-Service am ehesten akzeptiert und verbreitet; kaum mehr eine externe API, die nicht auf RESTful basiert.
SOAP(SVC) ist definitiv outdated für neue Anwendungen.

Die Tatsache, dass er über den Endpoint klagt sollte Dir eigentlich sagen, dass Du uns das Binding zeigen solltest. Sonst ist das heiteres Raten in der Glaskugel ;-)

PS: eine externe API sollte eine Authentifizierung haben. Entweder über eine Key-Variante wie die Großen (Google, Facebook, Twitter) oder über eine native Authentifizierung Deiner Wahl.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
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

Hallo,

das man über einen DNS Eintrag den Service Namen ändern kann wäre mir neu. Es müsste bei beiden barService.svc (oder Bar.svc) sein.
Generell sollte es keinen Unterschied machen ob du von aussen oder innen drauf zugreifst. Wie sieht die baseadress vom Endpoint aus?

Um es genau zu analysieren was los ist, und ob überhaupt was am Server ankommt würde ich den Fiddler zwischen schalten(Muss man natürlich für eingehende Verbindungen konfigurieren).
private Nachricht | Beiträge des Benutzers
Prot
myCSharp.de - Member

Avatar #avatar-3487.jpg


Dabei seit:
Beiträge: 5
Herkunft: Schland

Themenstarter:

beantworten | zitieren | melden

Meinst du die <system.ServiceModel><system.ServiceModel> aus der App.config? Sorry du musst schon konkreter werden hier ich habe 0 Erfahrung mit WebServices.
http://pressbit.wordpress.com/about/
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

unconnected, die Anfrage kommt ja am Webserver an;das ist ja aus der Fehlermeldung zu entnehmen. Mit DNS meint er wohl die Domain des Servers (in seinem Beispiel *ttp//Foo.de/) - nicht den Namen des Services.

Prot, dann ist es aller höchste Eisenbahn, dass Du Dir die Grundlagen aneignest - das ist Deine Aufgabe und soviel Eigeninitiative erwarten wir. Wir werden nicht Lehrer spielen ;-)
Und ja, ich meine die Bindings aus der Config: Configuring Bindings for Windows Communication Foundation Services

Schau Dir für die Grundlagen am besten Channel9 Videos an.
Da bekommst du Recht schnell einen Input, ohne, dass Du viel lesen musst.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
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

Hmm wenn der ankommt, warum gehts dann nur von innen? Muss wohl doch mit der baseAdress zu tun haben -> Glaskugel :)
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

Sein Text ist vielleicht etwas wir.

Deine Auffassung basier wohl auf
Zitat
Innerhalb unseres Netzwerks kann man ohne Probleme darauf zugreifen und konsumieren.
Meine auf
Zitat
Dann sollte der Diesnt auch [...] einen DNS-Eintrag tätigen lassen [...] und anscheinend können sie darauf zugreifen.

Vielleicht sollte der Ersteller nochmals präziser sagen, was jetzt geht und was nicht.
  • Geht's von innen per Intranet-Url? Nein? Fehlermeldung?
  • Geht's von innen per Internet-Url? Nein? Fehlermeldung?
  • Geht's von extern per Internet-Url? Nein? Fehlermeldung?
Die können theoretisch alle unterschiedlich sein.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Prot
myCSharp.de - Member

Avatar #avatar-3487.jpg


Dabei seit:
Beiträge: 5
Herkunft: Schland

Themenstarter:

beantworten | zitieren | melden

  • Von innen, per Intranet-Url geht alles.
  • Von extern geht über die Internet-Url nichts.


Von innen über die per Internet-Url komme ich zum Beispiel auf die .svc-Seite mit dem svcutil.exe Befehl. Aber wenn ich diesen dann über die Developer-Konsole ausführe bekomme ich:

Fehler: Aus [URL]https://Foo.de/webservices/Bar.svc?wsdl[/URL] können keine Metadaten abgerufen werden.

Wenn es sich hierbei um einen Windows (R) Communication Foundation-Dienst handelt, auf den Sie Zugriff haben, prüfen Sie, dass die Metadatenveröffentlichung für
die angegebene Adresse aktiviert ist. Informationen zum Aktivieren der Metadatenveröffentlichung finden Sie in der MSDN-Dokumentation MSDN unter 
[URL]http://go.microsoft.com/fwlink/?LinkId=65455[/URL].

WS-Metadatenaustauschfehler URI: [URL]https://Foo.de/webservices/Bar.svc?wsdl[/URL]

Metadaten enthalten einen Verweis, der nicht aufgelöst werden kann: "https://Foo.de/webservices/Bar.svc?wsdl".

Der Inhaltstyp "application/soap+xml; charset=utf-8" wurde von Dienst "https://Foo.de/webservices/Bar.svc?wsdl" nicht unterstützt. Möglicherweise stimmen Client- und Dienstbindungen nicht überein.

Der Remoteserver hat einen Fehler zurückgegeben: (415) Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'..

HTTP GET Error
    URI: [URL]https://Foo.de/webservices/Bar.svc?wsdl[/URL]

    Das Dokument wurde erkannt, konnte jedoch nicht verarbeitet werden.
  - Das WSDL-Dokument enthält Links, die nicht aufgelöst werden konnten.
  - Fehler beim Downloaden von 'http://Foo.de:443/webservices/Bar.svc?xsd=xsd0'.
  - Timeout für Vorgang überschritten

Mit WcfStorm bekomme ich:
Endpoint is invalid. Make sure that the service has an exposed MEX (wsdl) endpoint.

In die erste Meldung kann ich schon was reininterpretieren aber was ich dagegen tun soll weiss ich nocht nicht.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Prot am .
http://pressbit.wordpress.com/about/
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

Wie sehen denn jetzt Deine Bindings aus?
Siehe dazu auch How to: Host a WCF Service in IIS
Interessant ist zudem nicht nur das Binding aus der WCF Config, sondern auch das, was Du im IIS eingetragen hast, damit die URL (foo.de) auf Deinen Service geleitet wird (virtual host).
Zitat
http://Foo.de:443/
sieht ungesund aus. Port 443 steht für SSL Verschlüsselung; jedoch mit dem HTTP Protokoll => ungut.
Hast Du den Port direkt vergeben, oder SSL aktiviert oder was hast Du getan?

Im Eingangspost hast Du noch nichts mit https erwähnt; da war alles http.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Prot
myCSharp.de - Member

Avatar #avatar-3487.jpg


Dabei seit:
Beiträge: 5
Herkunft: Schland

Themenstarter:

beantworten | zitieren | melden

Also zumindest in der Web.config steht kein Binding Tag also gehe ich davon aus, dass irgendwelche Default-Bindings benutzt werden.

Zu
http://Foo.de:443/

Ganz ehrlich ich bin ein wenig am verzweifeln. Ich hatte noch nie was mit WebServices am Hut. Dann hieß es "Deploy den mal." habe ich gemacht. Dann "mach den mal extern zugänglich." Also bin ich zu den entsprechenden Leuten gegangen, die haben wohl beim Provider irgendwas mit der internen Adresse machen lassen. Was genau weiss ich nicht (DNS?). Zumindest hatte ich dann von ihnen "http://Foo.de" bekommen. Anscheinend konnten Externe C#-Menschen dann darauf zugreifen.

Jetzt kommt der PHP/Ubuntu-Mensch und meint bei ihm geht es nicht :(

Ich lese mich gerade ein, aber es ist viel und vor allem schwer etwas konkretes zu meinem spezifischen Fall zu finden. Ich erwarte von keinem, dass er Lehrer spielt ;) Aber wenn man mich in die richtige Richtung lenken würde wäre das schon nett.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Prot am .
http://pressbit.wordpress.com/about/
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

Also Deine Informationen sind enorm verwirrend.
Bei C# Menschen tuts, bei PHP nicht. Was heisst das?
Geht jetzt doch extern, aber nur bei C# Entwicklern, oder bei allen nicht?

Mit den Informationen ist das alles etwas... suboptimal...
Und "mach einfach mal" war noch nie gut - vor allem wenn dann auch noch SSL im Spiel ist. Wollt ihr euch nicht jemanden suchen, der sich damit wirklich auskennt und Dich parallel - wenn es dauerhaft ist - gescheit einlernt?
Ja. WCF ist nicht wenig und ja, korrektes Handlen von IIS Deployments ebenfalls nicht. Damit kann man ganze Arbeitsplätze schaffen.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Prot
myCSharp.de - Member

Avatar #avatar-3487.jpg


Dabei seit:
Beiträge: 5
Herkunft: Schland

Themenstarter:

beantworten | zitieren | melden

Zitat von Abt
Also Deine Informationen sind enorm verwirrend.
Bei C# Menschen tuts, bei PHP nicht. Was heisst das?
Geht jetzt doch extern, aber nur bei C# Entwicklern, oder bei allen nicht?

Mit den Informationen ist das alles etwas... suboptimal...
Und "mach einfach mal" war noch nie gut.

Wem sagst du das "mach mal einfach" konnte ich mir leider nicht aussuchen. Aber ja die C# Menschen habe positives Feedback gegeben während der PHP-Mensch seit Tagen struggle hat. Ich wünschte ich könnte ausführlichere Infos geben nur bin ich mir nicht sicher worauf es ankommt.
http://pressbit.wordpress.com/about/
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

Also geht es jetzt doch per Int_er_net, nur halt für die PHP'ler nicht.
Vorhin hast Du eben was ganz anderes gesagt.
Zitat
Von extern geht über die Internet-Url nichts.
So macht das wenig Sinn. Wir drehen uns sinnfrei im Kreis.

Da ich mich mit PHP nicht auskenne (und auch nicht tiefer auskennen möchte) kann ich da leider keine Hilfe bieten.
Evtl verwendest Du im SOAP Elemente, die PHP nicht versteht, sondern nur .NET.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers