WCF, Metadaten und BigIP - Kann ich die richtige URL für die WSDL-Elemente erzwingen?

StackOverflow https://stackoverflow.com/questions/634522

  •  10-07-2019
  •  | 
  •  

Frage

Wir haben einen WCF-Dienst auf Server gehostet, die ein Server ohne-direkten Internet-Zugang und haben eine nicht-Internet routable IP-Adresse.

Der Dienst wird von BigIP konfrontiert die SSL-Verschlüsselung und Entschlüsselung behandelt und leitet die verschlüsselte Anfrage an ServerA (im Moment ist es nicht tatsächlich jede Load Balancing tun, aber das ist wahrscheinlich in der Zukunft hinzugefügt werden) auf einem bestimmt Port .

Was das bedeutet, ist, dass unsere Kunden den Service über https://www.OurDomain.com/ServiceUrl Aufruf würde und würde sich auf unseren Service auf http: // Severa: 85 / ServiceUrl durch die BigIP Gerät;

Wenn wir auf die WSDL durchsuchen veröffentlicht auf https://www.OurDomain.com/ServiceUrl alle die Adressen in der WSDL enthalten sind, auf der http: // Severa: 85 / ServiceUrl Basisadresse

Wir haben herausgefunden, dass wir die Host-Header Einstellung verwenden, könnten die Domäne festgelegt, aber unser Problem ist, dass während dieser die Domain aussortieren würde, würden wir immer noch das falsche Schema verwendet werden - es würde verwenden http://www.OurDomain.com/ServiceUrl während wir es brauchen Https zu sein.

Auch - wie wir noch andere Leistungen haben (asmx basiert) gehostet auf dem Server wir den Host-Header Einstellung hatten einige Probleme, und so dachten wir, dass wir mit dem Erstellen von einer anderen Website auf dem Server wegkommen könnten (mit, sagen sie, Port 82) und stellen Sie den Host-Header auf das; jetzt, auf dem http / https Problem haben wir ein Problem, wie die WSDL die Port-Nummer in allen URLs enthält, wo BigIP auf Port 443 (für SSL) arbeitet

Gibt es eine flexiblere Lösung als Host-Header zu implementieren? Im Idealfall brauchen wir Flexibilität und einfache Wartbarkeit zu halten.

Danke für jede Hilfe ...

War es hilfreich?

Lösung

Dies ist im Wesentlichen ein mehrteilige Problem, dass eine Anzahl von diskreten Lösungen beinhaltet die vollständige Antwort zu geben. Im Wesentlichen gibt es drei Probleme hinter dem F5 mit Sitzmöglichkeit.

  1. Die angekündigten Service-Endpunkt-Hostnamen.
  2. Hostname von Links zu xsd: import'ed Schemata, die den Datenvertrag
  3. beschreiben
  4. das http / https Problem, das Sie beschreiben.

Ändern der Host-Header, wie Sie löst 1 und 2 gefunden haben (Sie dies auf andere Weise als Host-Header nähern kann, aber keine Notwendigkeit, in das hier zu gehen). Nummer 3 ein wenig komplizierter und erfordert mehr Code (zu viel hier auskippen).

Die kurze Antwort ist, dass Sie eine ContractBehavior schreiben müssen, die sowohl IContractBehavior und IWsdlExportExtension implementiert.

Das wichtige Bit Sie implementieren müssen, ist die IWsdlExportExtension.ExportEndpoint. Innerhalb dieser Methode müssen Sie alle WsdlPort Extensions laufen, und wenn Sie eine Erweiterung finden, die vom Typ ist SoapAddressBinding Sie die SoapAddressBinding.Location Eigenschaft mit einem neuen Uri ersetzen müssen, die das https-Protokoll-Spezifizierer enthält. Sie müssen auch Ähnliche Bits für die XSD-Adressen importieren und Schema Links zu tun.

Wenn Ihr Dienst wird auch mit WS-Addressing Sie müssen dann etwas zu tun, ähnlich die zusätzliche Adressen umgehen, um die WSDL-Datei schreibt.

basierend ich den Code, den ich auf dem WsdlExtras Projekt auf CodePlex verfügbar endete schriftlich ( http: // wcfextras. codeplex.com/ ). Das Verfahren in dem WsdlExtras verwendet wird, stellt einen idealen Ausgangspunkt für jede zusätzliche Bits, die Sie benötigen, um es hinzuzufügen (Aus dem Gedächtnis Ich denke, es ist nicht mit der WS-Addressing Bits behandelt). Das Bit Sie betrachten wollen, ist die „Aufschalten SOAP Adresse Lage URL“.

Andere Tipps

Dank Mark Allanson, ich hatte genau das gleiche Szenario wie Yossi Dahan hatte, die WCFExtras.dll Datei für mich gearbeitet,

Schritt 1. Laden Sie die WCFExtras.dll (http://www.codeplex.com/WCFExtras/) .
Schritt 2. fügen Sie es Bezug auf Ihr Projekt.
Schritt 3. Ihre Zeit vergeudet keinen Code in schriftlicher Form, wie in der Probe Server-Anwendung vorgeschlagen.
Schritt 4. Öffnen Sie die web.config und setzen Sie den folgenden Code:

  <system.net>
     <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
     </settings>
  </system.net>


<system.serviceModel>
<services>
  <service behaviorConfiguration="ServiceBehaviorName" name="ServiceName">
    <endpoint address="" behaviorConfiguration="ServiceEndpointBehaviorName" binding="basicHttpBinding" contract="IServiceName">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="ServiceEndpointBehaviorName">
      <wsdlExtensions location="https://sslLoadBalancer/ServiceName.svc"/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehaviorName">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<extensions>
  <behaviorExtensions>
    <!-- Declare that we have an extension called WSDL Extras-->
    <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
</extensions>
        </system.serviceModel>


step5. auch wichtig zu beachten, dass, wenn Sie Verweis von dieser URL "https://sslLoadBalancer/ServiceName.svc" hinzufügen, dann wird es nicht funktionieren, immer daran denken Referenz als hinzuzufügen: "https://sslLoadBalancer/ServiceName.svc?wsdl" diese Art und Weise werden Sie in der Lage sein, auf Ihre Anwendung hinzuzufügen.

Das ist es ... wenn noch funktioniert mich nicht, dann lassen Sie wissen, ich werde die volle web.config Datei einfügen ..

Danke

Wenn Sie SSL auf dem bestehenden Service hinzufügen, es wäre wahrscheinlich auch die Bindung des Sicherheitsmodus für WCF-Client auswirken, die Sie leicht außer Kraft setzen können.

Für WSDL, warum Sie nicht nur die Dateien herunterladen, die URL ändern, was auch immer Sie wollen, und veröffentlichen Sie sie manuell als Dateien?

Ich habe einen tollen Tipp, dass die Adresse Attribut auf dem Endpunkt die URL setzen Sie in der WSDL angezeigt werden sollen und dann ein nuri an den Endpunkt mit dem eigentlichen Uri, den Trick zu hören Attribut hinzufügen, auf tun würde.

Die URL in der Testseite wird nicht betroffen (das heißt es wird immer noch die Adresse zeigt im nuri angegeben), aber innerhalb der WSDL der richtige Uri wird gesetzt (die in der Adresse nicht angegeben.

Die meisten annoyingly, obwohl - wenn ich das versucht, kurz nachdem ich die Frage gestellt, konnte ich es nicht bekommen innerhalb IIS zu arbeiten, nur dann, wenn sich in einer Konsole App Hosting; Ich fand die Überprüfung mich heute, dass es tatsächlich funktioniert; so jetzt bin ich nicht sicher, warum es nicht für mich, bevor funktioniert;

Was wir in der Zwischenzeit getan haben, ist ein einfaches benutzerdefiniertes Verhalten buid, die die Servicebeschreibung setzt die Adresse in der WSDL von configurtion erforderlich geändert; natürlich, wenn zur Unterstützung dort gebaut ist für, dass es viel besser, also werde ich hopfully einige Zeit nächste Woche in diese weiter zu suchen.

Um die Service-Klasse fügen Sie das Attribut:

<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)>

Dies ermöglicht es der Service durch die Kunden als https angesprochen werden: // ... aber der Service gehostet auf http 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. Im gleichen Endpunkt Element, setzen die nuri auf die absolute URL-Attribut, auf dem der Service-Host hört. Die Art, wie ich bestimmen, was der Standard absolute URI der Host auf zuhört ist ein Dienstverweis in einer Client-Anwendung hinzuzufügen, die die den physischen Server verweist, in dem der Dienst gehostet wird. Die web.config des Kunden wird eine Adresse für den Dienst. Ich kopiere dann, dass in das nuri Attribut in der Hosts-web.config.

In Ihrem Dienst Verhalten Konfiguration fügen Sie das Element serviceMetaData mit dem Attribut httpGetEnabled = true

So werden Sie so etwas wie haben:

<serviceBehaviors>
  <behavior name="myBehavior">
    <serviceMetadata httpGetEnabled="true" />
  </behavior
</serviceBehaviors>
...
<services>
  <service name="NamespaceQualifiedServiceClass" behavior="myBehavior" >
    <endpoint address="https://www.sslloadbalancer.com" binding="someBinding" contract="IMyServiceInterface" listenUri="http://www.servicehost.com" ...  />
  </service>
</services>

Ich bin nicht sicher, ob dies mit der Nachrichtensicherheit oder Transportsicherheit arbeitet. Für diese spezielle Anwendung wurden die Anmeldeinformationen als Teil des Datacontract geführt, so hatten wir Basichttpbinding Sicherheitsmodus = keine. Da der Transport (zum ssl Load Balancer) sicher ist es keine Sicherheitsprobleme.

Es ist in auch möglich, die nuri leer lassen Attributs, jedoch muss 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 finden Sie hier: http://winterdom.com/2006/10/inlinexsdinwsdlwithwcf . Zusätzlich können Sie die Beispielklasse vererben BehaviorExtensionElement haben und füllen Sie die beiden neuen Methoden mit:

Public Overrides ReadOnly Property BehaviorType() As System.Type
    Get
        Return GetType(InlineXsdInWsdlBehavior)
    End Get
End Property

Protected Overrides Function CreateBehavior() As Object
    Return New InlineXsdInWsdlBehavior()
End Function

Auf diese Weise können Sie ein Verlängerungsverhalten in der .config-Datei hinzufügen und das Verhalten unter Verwendung von Konfiguration hinzuzufügen, anstatt eine Service-Fabrik erstellen zu müssen.

unter dem System.ServiceModel Konfigurationselement hinzu:

  <endpointBehaviors>
    <behavior name="SSLLoadBalancerBehavior">          
      <flattenXsdImports/>
    </behavior>
  </endpointBehaviors>
        </behaviors>
<extensions>
  <behaviorExtensions>
    <!--The full assembly name must be specified in the type attribute as of WCF 3.5sp1-->
    <add name="flattenXsdImports" type="Org.ServiceModel.Description.FlattenXsdImportsEndpointBehavior, Org.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>        
  </behaviorExtensions>
</extensions>

Und dann den neuen Endpunkt Verhalten in Ihrer Endpunktkonfiguration verweisen auf die behaviorConfiguration Attribut mit

<endpoint address="" binding="basicHttpBinding" contract="WCFWsdlFlatten.IService1" behaviorConfiguration="SSLLoadBalancerBehavior">
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top