2011-01-25 12 views
23

Ho scritto un servizio Web WCF per il consumo da un'app Silverlight. Inizialmente, il servizio richiedeva solo un binding http di base. Ora dobbiamo essere in grado di distribuire il servizio per l'utilizzo sia in http che in https. Ho trovato alcune impostazioni per web.config che mi permettono di fare questo nel modo seguente:Distribuzione del servizio WCF con entrambe le associazioni http e https/endpoint

<system.serviceModel> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="SilverlightFaultBehavior"> 
     <silverlightFaults /> 
     </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
     <behavior name="CxtMappingWebService.CxtMappingWebServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="SecureHttpBinding"> 
     <security mode="Transport" /> 
     </binding> 
     <binding name="BasicHttpBinding"> 
     <security mode="None" /> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 
    <services> 
    <service name="CxtMappingWebService.CxtMappingWebService" behaviorConfiguration="CxtMappingWebService.CxtMappingWebServiceBehavior"> 
     <endpoint address="" bindingConfiguration="SecureHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" /> 
     <endpoint address="" bindingConfiguration="BasicHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
    </services> 
</system.serviceModel> 

Purtroppo, però, c'è un problema con questo.

Questo servizio Web deve essere distribuito su centinaia di server dei nostri clienti e non tutti utilizzeranno https. La sua distribuzione su un server che non ha una configurazione https vincolante in IIS provoca il fallimento. C'è un modo per avere entrambi questi binding in web.config per impostazione predefinita senza che muoia se non c'è un binding https impostato in IIS?

Abbiamo una possibile soluzione per questo problema, ma non si adatta perfettamente ai nostri requisiti di implementazione.

Qualcun altro ha mai riscontrato qualcosa di simile prima e come è stato risolto?

+0

cos'è *** silverlightFaults ***? – Kiquenet

risposta

5

La risposta accettata in questa pagina non è molto utile se non si utilizza un programma di installazione. La risposta corretta si trova in una successiva modifica dell'OP stesso, tutto ciò che si deve fare è collegare entrambe le porte http e https in IIS e quindi usare la configurazione seguente.

  <service name="CxtMappingWebService.CxtMappingWebService" behaviorConfiguration="CxtMappingWebService.CxtMappingWebServiceBehavior"> 
       <endpoint address="" bindingConfiguration="SecureHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" /> 
       <endpoint address="" bindingConfiguration="BasicHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" /> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
      </service> 

Questo ha funzionato bene per me!

+0

Perché ci provo, ottengo un'eccezione ServiceActivationException. ... non può essere attivato a causa di un'eccezione durante la compilazione. Il messaggio di eccezione è: Impossibile aggiungere due elementi con la stessa chiave a SynchronizedKeyedCollection .. ---> System.ArgumentException: impossibile aggiungere due elementi con la stessa chiave a SynchronizedKeyedCollection –

1

Due endpoint hanno lo stesso URI. Questo non è permesso in WCF. Dovresti essere in grado di specificare gli endpoint con associazioni diverse, ma l'URI deve essere diverso (ad esempio un numero di porta diverso o un contratto diverso).

+1

Questo è quello che ho pensato fino a quando l'ho configurato in questo modo solo per vedere se avrebbe funzionato, e per qualsiasi ragione, forse perché il binding https in IIS è impostato per la porta 443. L'unica cosa che non lo fa t lavoro sta cercando di farlo girare su una macchina in cui IIS non ha una configurazione https vincolante. – Zannjaminderson

+1

In realtà è possibile avere lo stesso indirizzo su più endpoint a causa del filtraggio del contratto e della distinzione tra un indirizzo dell'endpoint e un listenURI. Vedere [Endpoint multipli in un singolo ListenUri] (http://msdn.microsoft.com/en-us/library/aa395210.aspx) per i dettagli. – BitMask777

+0

Ho questo _bindings_ ('(tipo: hostname: porta)') in IIS: *** http: nessuno hostaname: 49759 ***, *** https: pre.company.es: 443 *** e ** * http: pre.company.es: 80 ***, E i miei ** URI ** _. *** baseaddress ***: _http: // preserver: 49759/vdir1/SilverlightServices/serv.svc_ e _https: //pre.company.es/vdir1/SilverlightServices/serv.svc_ Quale sarebbe l'indirizzo ** * *? – Kiquenet

4

Questo verrà gestito dall'installer che si utilizza per distribuire il servizio. Dovrebbe essere un prerequisito (o almeno lasciare un'opzione nel programma di installazione) per distribuire entrambi gli endpoint o solo quello http.

10

Alla fine, abbiamo deciso di andare con file esterni utilizzando l'attributo configSource per le associazioni, i comportamenti e servizi sezioni del web.config, in questo modo:

<bindings configSource="bindings.config" /> 
<behaviors configSource="behaviors.config" /> 
<services configSource="services.config" /> 

In questo modo, abbiamo distribuire essa per impostazione predefinita con quei file esterni configurati solo per l'accesso http e fornire istruzioni (o assistenziali) ai clienti su come modificare i file esterni da configurare per l'accesso https. Questo ci permette anche di implementare future modifiche al web.config stesso senza sovrascrivere i file di configurazione esterni.

+0

hai provato qualche soluzione per l'associazione http e https? qualunque *.configurazioni per case http-https o solo http? – Kiquenet

Problemi correlati