Wie kann ich WSDL eines WCF-Webdienstes, der sich in einem privaten LAN befindet, hinter einem Reverse-Proxy, der öffentliche IP-Adressen abfragt, korrekt bedienen?
Ich habe einen Apache-Webserver im Reverse-Proxy-Modus konfiguriert, der auf Anfragen nach einer öffentlichen IP-Adresse wartet und sie vom internen IIS-Host aus bedient. Der WCF-Webservice generiert WSDL unter Verwendung der FQDN-Adresse des LAN-Hosts, die von einem Internet-Web-Service-Client natürlich nicht gelesen werden kann.
Gibt es eine Einstellung, die in der web.config der Webanwendung oder in IIS konfiguriert werden kann, um die generierte WSDL, die die Hostadresse enthält, anzupassen und stattdessen die öffentliche Adresse zu setzen?
Fügen Sie Ihrer Serviceklasse das Attribut hinzu:
%Vor%Dies ermöglicht es der Service durch die Kunden als https angesprochen werden: // ... aber der Service auf http gehostet werden: // ..... Siehe diese Antwort wie eine Erweiterung schaffen AddressFilterMode.Any zu ermöglichen, ohne dass Code Attribute durch die Konfiguration festgelegt werden .
In der web.config der Service-Host, muss der Endpunkt Element eine absolute URL in dem Adress Attribute, das die öffentliche URL ist, die vom Client verwendet wird. Setzen Sie das Attribut listenUri im gleichen Endpunktelement auf die absolute URL, auf der der Service-Host empfangsbereit ist. Die Art und Weise, wie ich den standardmäßigen absoluten URI, den der Host überwacht, festlege, besteht darin, in einer Client-Anwendung eine Dienstreferenz hinzuzufügen, die auf den physischen Server verweist, auf dem der Dienst gehostet wird. Die web.config des Clients wird eine Adresse für den Dienst haben. Ich kopiere das dann in das hostUri-Attribut in der hosts web.config.
Fügen Sie in Ihrer Konfiguration für das Dienstverhalten das Element serviceMetaData mit dem Attribut httpGetEnabled = true
hinzuSie haben also etwas wie:
%Vor%Ich bin mir nicht sicher, ob dies mit Nachrichtensicherheit oder Transportsicherheit funktioniert. Für diese spezielle Anwendung wurden die Anmeldeinformationen als Teil von DataContract übergeben, sodass basicHttpBinding den Sicherheitsmodus = none hatte. Da der Transport sicher ist (zum SSL Load Balancer) gab es keine Sicherheitsprobleme.
Es ist auch möglich, das Attribut listenUri leer zu lassen, es muss jedoch vorhanden sein.
Leider gibt es einen Fehler in WCF, wo die die Basisadresse des importierten Schemas in der WSDL die nuri Basisadresse hat, anstatt die öffentliche Basisadresse (die konfiguriert ist, die Adresse Attribut des Endpunkts verwendet wird). Zum Umgehen dieses Problems, benötigen Sie eine IWsdlExportExtension Implementierung zu schaffen, die das importierte Schema in das WSDL-Dokument bringt direkt und entfernt die Importe. Ein Beispiel hierfür ist vorgesehen, hier Ссылка . Darüber hinaus können Sie die Beispielklasse von BehaviorExtensionElement erben lassen und die beiden neuen Methoden mit:
vervollständigen %Vor%Dadurch können Sie ein Erweiterungsverhalten in der .config-Datei hinzufügen und das Verhalten mithilfe der Konfiguration hinzufügen, anstatt eine Service Factory erstellen zu müssen.
unter dem Konfigurationselement system.servicemodel add:
%Vor%Dann referenzieren Sie das neue Endpunktverhalten in Ihrer Endpunktkonfiguration mit dem Attribut behaviorConfiguration
%Vor%Tags und Links wcf reverse-proxy wsdl