2010-09-29 8 views
8

Was ich versuche zu tun, ist ein SINGLE WCF-Dienst in der Entwicklungsumgebung zu arbeiten, die das HTTP-Schema ist, und auch den gleichen Dienst in der Produktionsumgebung arbeiten, die das HTTPS-Schema ist. Wenn ich die zwei Https-Endpunkte entferne (die mit dem Suffix "Https"), funktioniert es in der Entwicklungsumgebung; Wenn ich nur die beiden Http-Endpunkte entferne, funktioniert es in der Produktionsumgebung. Ich hätte gerne alle vier Endpunkte in der web.config, wenn möglich.Konfigurieren eines einzelnen WCF-Dienstes für mehrere HTTP- und HTTPS-Endpunkte?

Meine Endpunkte sind nachstehend definiert:

<endpoint address="/Web" 
     behaviorConfiguration="AjaxBehavior" 
     binding="wsHttpBinding" 
     bindingConfiguration="web" 
     name="Web" 
     contract="Service" /> 
<endpoint address="/Custom" 
     binding="customBinding" 
     bindingConfiguration="custom" 
     name="Custom" 
     contract="Service" /> 
<endpoint 
     address="/WebHttps" 
     behaviorConfiguration="AjaxBehavior" 
     binding="wsHttpBinding" 
     bindingConfiguration="webHttps" 
     name="WebHttps" 
     contract="Service" /> 
<endpoint address="/CustomHttps" 
     binding="customBinding" 
     bindingConfiguration="customHttps" 
     name="CustomHttps" 
     contract="Service" /> 

Edited: ich meine Frage bin der Bearbeitung der Fehler Ich erhalte, und die Bindungsabschnitte (unten) hinzuzufügen. Entschuldigung für die neue Länge der Frage. Der Fehler lautet: "Es konnte keine Basisadresse gefunden werden, die mit dem Schema http für den Endpunkt mit bindendem WebHttpBinding übereinstimmt.

Außerdem ist die Produktionsumgebung auf "SSL erforderlich" eingestellt. Das kann sich nicht ändern.

Die Bindungen Konfigurationen sind:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="AjaxBehavior"> 
     <enableWebScript/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

<bindings> 
    <customBinding> 
    <binding name="custom"> 
     <textMessageEncoding> 
     <readerQuotas maxDepth="7000000" maxStringContentLength="7000000" 
      maxArrayLength="7000000" maxBytesPerRead="7000000" 
      maxNameTableCharCount="7000000" /> 
     </textMessageEncoding> 

     <httpTransport maxBufferPoolSize="7000000" maxReceivedMessageSize="7000000" 
      maxBufferSize="7000000" /> 
    </binding> 
    <binding name="customHttps"> 
     <textMessageEncoding> 
     <readerQuotas maxDepth="7000000" maxStringContentLength="7000000" 
      maxArrayLength="7000000" maxBytesPerRead="7000000" 
        maxNameTableCharCount="7000000" /> 
     </textMessageEncoding> 

     <httpsTransport maxBufferPoolSize="7000000" maxReceivedMessageSize="7000000" 
      maxBufferSize="7000000" /> 

    </binding> 
    </customBinding> 

    <webHttpBinding> 
    <binding name="web" maxBufferPoolSize="70000000" 
     maxReceivedMessageSize="70000000"> 
     <readerQuotas maxDepth="70000000" maxStringContentLength="70000000" 
      maxArrayLength="70000000" maxBytesPerRead="70000000" 
      maxNameTableCharCount="70000000" /> 
     <security mode="None" /> 
    </binding> 

    <binding name="webHttps" maxBufferPoolSize="70000000" 
     maxReceivedMessageSize="70000000"> 

     <readerQuotas maxDepth="70000000" maxStringContentLength="70000000" 
       maxArrayLength="70000000" maxBytesPerRead="70000000" 
       maxNameTableCharCount="70000000" /> 

     <security mode="Transport" /> 
    </binding> 
    </webHttpBinding> 
</bindings> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

Irgendwelche Ideen?

+0

haben Sie versucht und erhalten endgültige Lösung? – Kiquenet

Antwort

0

Dies ist ein Grund, warum Sie die Bindung über die Konfiguration einrichten können: Um verschiedene Einstellungen in verschiedenen Umgebungen verwenden zu können.

Die einfachste Lösung für Sie ist die Verwendung von makecert, um ein Testzertifikat für Ihre Entwicklungsumgebung zu erstellen und HTTPS sowohl auf der Entwicklungs- als auch auf der Produktionsmaschine zu verwenden.

Eine andere Lösung besteht darin, ein Installationspaket (msi) zu erstellen und adin während der Installation die Enpoint-Einstellungen ändern zu lassen.

Edit:

Ihre Anforderung erreichbar auf beiden Maschinen alle 4 Endpunkte zu haben, ist aber in diesem Fall wird Ihr Dienst auch in der Produktion und alle auf HTTP ausgesetzt werden, die WSDL für den Dienst haben wissen Das.

+0

Selbstsignierte Zertifikate können nicht verwendet werden, da ich den VS Development Server verwenden muss. Dies ist eine praktikable Lösung, aber es wäre mein letzter Ausweg. Momentan denke ich darüber nach, eine ServiceHostFactory zu verwenden und alle Bindungen und Endpunkte dynamisch aus einem Konfigurationsabschnitt zu erstellen. Ich bin frustriert mit WCF – Breakskater

+0

Sie sind frustriert, weil Sie VS Development Server verwenden, der die meisten WCF-Funktionen nicht unterstützt. WCF ist keine Quelle Ihrer Frustration. Schlechte Werkzeuge sind. –

+0

Ich stimme zu. Visual Studio Development Server sollte HTTPS unterstützen. Dies würde zu einer besseren Test/Debug-Umgebung führen, wenn dies der Fall wäre. Ich bin hauptsächlich bei VSDS frustriert. Ich müsste nur eine Konfiguration für das HTTPS-Schema haben, wenn VSDS es unterstützt. Breakskater

17

Gehen Sie wie folgt Schritten-

1) zwei Endpunkte für den Dienst ist eine für http und eine andere für https.

<services> 
    <service behaviorConfiguration="MyServiceBehavior" name="JK.MyService"> 

     <endpoint address="" behaviorConfiguration="WebBehavior" binding="webHttpBinding" bindingConfiguration="webBinding" contract="JK.IMyService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 

     <endpoint address="" behaviorConfiguration="WebBehavior" binding="webHttpBinding" bindingConfiguration="webBindingHTTPS" contract="JK.IMyService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint>  

    </service> 
    </services> 

2) Aktivieren Sie beide httpGetEnabled = "True" httpsGetEnabled = "true" in serviceBehaviors.

3) Schreiben Sie zwei Bindungskonfigurationen für http und https. Für http gebe security mode = "None" und für https gib mode = "Transport".

<bindings> 
    <webHttpBinding> 

     <binding name="webBinding"> 
     <security mode="None"> 
      <transport clientCredentialType="None" /> 
     </security> 
     </binding> 

     <binding name="webBindingHTTPS"> 
     <security mode="Transport"> 
      <transport clientCredentialType="None" /> 
     </security> 
     </binding> 

    </webHttpBinding> 
    </bindings> 

prüfen diese link

+0

Vinay, danke für deinen Vorschlag. Ich habe es versucht und den Fehler in meiner neuen bearbeiteten Frage erhalten. Ich habe meine verbindliche Konfiguration zur Überprüfung veröffentlicht. Darüber hinaus ist die Produktionsumgebung so eingerichtet, dass SSL erforderlich ist. Das kann sich nicht ändern. – Breakskater

+0

Ihre Endpunkte geben eine relative Adresse für die Endpunkte an, was bedeutet, dass sie alle dieselbe Basisadresse verwenden, die entweder http oder https angeben muss. Sie könnten die Endpunktadressen als absolut definieren (anstelle von "/ web" sagen Sie "http:/myurl".com/web 'und das sollte deinen Fehler beheben. –

+0

@SteveEllinger Ich habe diese _Bindings_ ('(Typ: Hostname: Port)') in IIS: *** http: keine Hostaname: 49759 ***, *** https: pre.company.es: 443 *** und *** http: pre.company.es: 80 ***, was ist mit der Endpunktadresse? Ich bekomme 'Konnte keine Basisadresse finden ...' Fehler oder '404 nicht gefunden 'für meine SVC, entsprechend meiner Konfiguration _servicemodel_ – Kiquenet

2

Wenn Sie Visual Studio 2010 und Web Application Project Deployment verwenden können Sie das Web nutzen.config Transformation Syntax, um die bindingConfiguration Ihres Service-Endpunkts auf eine https-fähige Bindungskonfiguration zu verweisen.

Für mich habe ich herausgefunden, dass ich nur zwei Elemente in der Datei Web.config ersetzen musste. Das bindingConfiguration-Attribut des Endpunkts und httpsGetEnabled von serviceMetadata sollten auf true festgelegt werden.

Hier ist die Web.config, in der Standardeinstellung (debug) Konfiguration:

<service name="Service" 
      behaviorConfiguration="DefaultBehavior"> 
    <endpoint name="ServiceEndpoint" 
       binding="basicHttpBinding" 
       bindingConfiguration="BasicHttpBinding" 
       contract="IService" /> 
    </service> 
    ... 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name="DefaultBehavior"> 
      <serviceMetadata httpGetEnabled="True" /> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

Hier ist die Web.Release.config Transformationsdatei

<behaviors> 
    <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpsGetEnabled="True" xdt:Transform="Replace" /> 
      <serviceDebug includeExceptionDetailInFaults="False" xdt:Transform="SetAttributes(includeExceptionDetailInFaults)"/> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service> 
     <endpoint bindingConfiguration="SecureTransportBinding" 
        xdt:Transform="SetAttributes(bindingConfiguration)"/> 
    </service> 
</services> 

Hier ist, was meine Bindungen aussehen, aber sie sind ziemlich Standard. beachten Sie die Namen, die oben verwendet werden:

<basicHttpBinding> 
    <binding name="SecureTransportBinding" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647"> 
     <security mode="Transport"/> 
     <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"/> 
    </binding> 
    <binding name="BasicHttpBinding" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647"> 
     <security mode="None"/> 
     <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"/> 
    </binding> 
</basicHttpBinding> 

Hier ist ein Link, um mehr über Web.config Transformationen:

http://msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx

+0

Danke! Die bindingCongification-Transformation war genau das, wonach ich suchte. –

1

Die Standard-Empfangs-Timeout 10 Minuten, wird so WCF-Client nach getrennt werden Die Leerlaufzeit hat diese Begrenzung überschritten. Was kann ich tun, wenn die Verbindung am Leben erhalten werden soll?

Lösung # 1:

Server stellt eine Dummy-Operation für Client ruft es regelmäßig nicht untätig zu lassen.

Lösung # 2:

reliableSession aktivieren und ReceiveTimeout und InactivityTimeout auf „unendlich“ in dem Client und Server festgelegt. Die Konfiguration Schnipsel kann wie folgt aus:

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="WSHttpBinding" receiveTimeout="infinite"> 
     <reliableSession inactivityTimeout="infinite" enabled="true" /> 
     </binding> 
    </wsHttpBinding> 
    </bindings> 
    <services> 
    ... 
    </services> 
    ... 
</system.serviceModel> 
1

Es gibt viele Gründe, warum Sie den Fehler bekommen:

Could not find a base address that matches scheme http for the endpoint 
    with binding WebHttpBinding. Registered base address schemes are [https]. 

Die meisten der Gründe dafür sind aus den Web.config-Einstellungen, aber es könnte sein, von IIS. Ich hatte die gleichen Probleme, wenn Sie Endpunkte mit HTTP- und HTTPS-Bindungen verteidigt haben, müssen Sie HTTP- und HTTPS-Bindung für die Website erstellen, die Sie in IIS-> Site-> Bindings erstellt haben, sonst erhalten Sie diesen Fehler.

Verwandte Themen