2010-12-03 2 views
19

Ich habe viel Zeit damit verbracht, herauszufinden, wie meine WCF-Dienste konfiguriert werden, damit sie in der Produktionsumgebung für HTTPS funktionieren.Wie kann ich die WCF-Dienstkonfiguration für http und https in einer web.config kombinieren?

Im Grunde brauchte ich, dies zu tun:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/> 
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="HttpsBinding"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

Hinzufügen der bindingNamespace Attribut auf den Endpunkt der letzte Sache ist, dass es funktioniert hat.

Aber diese Konfiguration funktioniert nicht in meiner lokalen Dev-Umgebung, wo ich unter regelmäßigen http arbeiten. Also meine Config gibt es:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/> 
    </service> 
</services> 

Die Unterschiede hier sind, dass ich das httpsGetEnabled Attribut auf false gesetzt habe, und ich nahm die bindingConfiguration und bindingNamespace.

Das Problem ist: wie kann ich einen Konfigurationsblock erstellen, die beide Griffe?

Ich hasse wirklich jedes Mal, wenn ich Release tun, um viele spezielle Änderungen an der Konfiguration mit. Ja, ich weiß, dass ich eine Post-Build-Aufgabe haben könnte, die automatisch die Werte ändert, aber ich würde die Configs wenn möglich zusammenführen.

habe ich versucht, so etwas wie dieses:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/> 
    <endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/> 
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="HttpsBinding"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

ich dachte, dass beide Endpunkte setzen würde es zwei Möglichkeiten zu suchen, wenn die Service-Aktivierung. Dies funktioniert jedoch nicht. Ich erhalte diesen Fehler:

Konnte keine Basisadresse finden, die mit dem Schema https für den Endpunkt mit der Bindung BasicHttpBinding übereinstimmt. Registrierte Basisadressenschemata sind [http].

Von umsah SO und dem Rest des Internets, scheint es, dass andere hatten Probleme mit diesen Drachen erschlagen.

+0

Hosten Sie Ihren WCF-Dienst in IIS oder hosten Sie selbst? –

+0

Sie werden als .svc-Dateien in einer ASP.NET-Webanwendung gehostet. Verwenden von IIS7 auf beiden Dev und Prod. – sohtimsso1970

+0

@ sohtimsso1970: Haben Sie eine Lösung gefunden? – Learner

Antwort

11

Nun, ein Problem mit dem kombinierten Konfiguration ist, dass Ihre zwei Endpunkte auf derselben Adresse sind -, die nicht funktionieren.

Wenn Sie in IIS hosten, dann den Server, das virtuelle Verzeichnis und die *.SVC-Datei bestimmen, Ihre Basisadresse benötigt - es wird so etwas wie:

http://yourservername/VirtualDirectory/YourService.svc 

Wenn Sie zwei Endpunkte haben, zumindest einer von ihnen eine relative Adresse definieren muss:

<services> 
    <service name="MyNamespace.MyService" 
      behaviorConfiguration="MyServiceBehavior"> 
     <endpoint 
      address="basic" 
      binding="basicHttpBinding" 
      contract="MyNamespace.IMyService"/> 
     <endpoint 
      address="secure" 
      binding="basicHttpBinding" bindingConfiguration="HttpsBinding" 
      contract="MyNamespace.IMyService"/> 
    </service> 
</services> 

in diesem Fall würden Sie Ihren HTTP-Endpunkt auf haben:

http://yourservername/VirtualDirectory/YourService.svc/basic 

und Ihre sichere HTTPS-Endpunkt auf:

https://yourservername/VirtualDirectory/YourService.svc/secure 

Außerdem: Ihre sicheren Endpunkt verwendet eine HttpsBinding Konfiguration - aber Sie fehlen eine solche Bindungskonfiguration - alles, was Sie haben, ist:

<bindings> 
    <basicHttpBinding> 
    <binding name="HttpBinding"> 
     <security mode="None"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

Sie benötigen die HttpsBinding Konfiguration hinzuzufügen !!

<bindings> 
    <basicHttpBinding> 
    <binding name="HttpBinding"> 
     <security mode="None"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    <binding name="HttpsBinding"> 
     <security mode="Transport"> 
      <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
+0

Entschuldigung für das Versehen, aber ich habe tatsächlich die sichere Bindung. Wenn Sie sich meine Top-Konfiguration ansehen - die auf dem Server -, hat sie die HttpsBinding-Funktion installiert. Dieser kombinierte Code, den ich gepostet habe, wurde von mir bei der Erstellung der SO-Frage manuell kuratiert. – sohtimsso1970

+2

Wenn ich verstehe, wie die Endpoint-Adressen funktionieren, ändert sich das Hinzufügen dieser relativen Positionen an der Stelle, an der auf die URL zugegriffen wird. Ich möchte die gleiche URL in beiden Dev und Prod verwenden. Ich möchte also am Ende nicht "einfach" oder "sicher" hinzufügen müssen, nur weil ich auf https umgestiegen bin. Sagst du, dass es sonst nicht möglich ist? – sohtimsso1970

+3

Haben Sie jemals eine Lösung zur Aktivierung von HTTP/HTTPS am selben Endpunkt gefunden? Ich bin in der gleichen Situation - im Wesentlichen bin ich dabei, den Wert securityMode in der Bindungskonfiguration basierend auf dem aktuellen Anfrageschema in Code – StickyMcGinty

2

Das Problem ist nicht mit der Konfigurationsdatei, sondern mit dem IIS-Setup. Sie müssen beide HTTP & HTTPS in IIS aktivieren. Wechseln Sie in IIS 7.5 zu Ihrer Website und klicken Sie unter Bearbeiten der Websiteaktion auf Bindungen. Stellen Sie sicher, dass beide HTTP-Adressen http & hinzugefügt wurden. Dann müssen Sie eine Bindung für HTTP unter <basicHttpBinding> erstellen, wobei der Sicherheitsmodus auf none festgelegt ist. Fügen Sie die neu erstellte Bindungskonfiguration dem HTTP-Endpunkt hinzu. Sie sind gut zu gehen. Lassen Sie mich wissen, wenn Sie ein weiteres Problem benötigen.

+0

Mein Problem: _bindings_ ('(Typ: Hostname: Port)') in IIS: *** http: keine Hostaname: 49759 ***, *** https: pre.company.es: 443 *** und * ** http: pre.company.es: 80 ***, UND *** baseaddress ***: _http: // erhalt: 49759/vdir1/SilverlightServices/serv.svc_ und _https: //pre.company.es /vdir1/SilverlightServices/serv.svc_ – Kiquenet

Verwandte Themen