Wir haben einen WCF-Dienst, der auf 12 Computern gehostet wird. Es gibt einen Load Balancer, der ein Gateway zu diesen Computern darstellt.
Jetzt ist die Site als SSL eingerichtet. wie bei einem Benutzer, der über eine URL mit https darauf zugreift. Ich weiß so viel, die URL, die die Site adressiert, ist https, aber keiner der Server hat eine https-Bindung oder ist so eingerichtet, dass SSL erforderlich ist. Dies lässt mich glauben, dass der Load Balancer das https verwaltet und die Verbindung vom Balancer zu den Servern unverschlüsselt ist (dies findet hinter der Firewall statt, also kein Problem).
Das Problem besteht darin, dass ein Silverlight-Client beim Versuch, auf einen WCF-Dienst zuzugreifen, den Fehler "Nicht gefunden" erhält. Ich habe zusammen mit unseren Entwicklercomputern eine Testsite eingerichtet und sichergestellt, dass die Bindungen und Endpunkte in der web.config mit dem Client zusammenarbeiten. In der Produktionsumgebung scheint es so zu sein, dass wir diesen Fehler erhalten.
Stimmt etwas mit der folgenden web.config nicht? Sollten wir festlegen, wie https anders behandelt wird?
Diesbezüglich sind wir derzeit ratlos, da ich jede programmatische Lösung mit Endpunkten und Bindungen ausprobiert habe. Keine der Lösungen, die ich gefunden habe, befasst sich mit einem Load Balancer so, wie wir es tun.
Informationen zum Web.config-Servicemodell:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="TradePMR.OMS.Framework.Services.CRM.CRMServiceBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
<behavior name="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregationBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="SecureCRMCustomBinding">
<binaryMessageEncoding />
<httpsTransport />
</binding>
<binding name="SecureAACustomBinding">
<binaryMessageEncoding />
<httpsTransport />
</binding>
</customBinding>
<mexHttpsBinding>
<binding name="SecureMex" />
</mexHttpsBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<!--Defines the services to be used in the application-->
<services>
<service behaviorConfiguration="TradePMR.OMS.Framework.Services.CRM.CRMServiceBehavior"
name="TradePMR.OMS.Framework.Services.CRM.CRMService">
<endpoint address="" binding="customBinding" bindingConfiguration="SecureCRMCustomBinding"
contract="TradePMR.OMS.Framework.Services.CRM.CRMService" name="SecureCRMEndpoint" />
<!--This is required in order to be able to use the "Update Service Reference" in the Silverlight application-->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
<service behaviorConfiguration="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregationBehavior"
name="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregation">
<endpoint address="" binding="customBinding" bindingConfiguration="SecureAACustomBinding"
contract="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregation" name="SecureAAEndpoint" />
<!--This is required in order to be able to use the "Update Service Reference" in the Silverlight application-->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
</configuration>
Die ServiceReferences.ClientConfig sieht folgendermaßen aus:
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding name="StandardAAEndpoint">
<binaryMessageEncoding />
<httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
</binding>
<binding name="SecureAAEndpoint">
<binaryMessageEncoding />
<httpsTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
</binding>
<binding name="StandardCRMEndpoint">
<binaryMessageEncoding />
<httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
</binding>
<binding name="SecureCRMEndpoint">
<binaryMessageEncoding />
<httpsTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="https://Service2.svc"
binding="customBinding" bindingConfiguration="SecureAAEndpoint"
contract="AccountAggregationService.AccountAggregation" name="SecureAAEndpoint" />
<endpoint address="https://Service1.svc"
binding="customBinding" bindingConfiguration="SecureCRMEndpoint"
contract="CRMService.CRMService" name="SecureCRMEndpoint" />
</client>
</system.serviceModel>
</configuration>
(Die Adressen sind ohne Bedeutung, da diese dynamisch so erstellt werden, dass sie auf die Maschine eines Entwicklers oder auf den Produktionsserver verweisen.)
quelle
Wir sind auf dasselbe Problem gestoßen und haben uns für eine Lösung entschieden, die von einem Entwickler bei Microsoft bereitgestellt wurde. Diese Lösung besteht darin, einen benutzerdefinierten HttpTransport zu erstellen, der die Anforderung überschreibt, SSL vom Load Balancer zum Server zu haben.
quelle