2016-04-12 66 views
9

Sto cercando di utilizzare https & http per il sito web. Il sito Web ha file .svc che fungono da servizio REST e chiamati da JavaScript.WebHttpBinding con Http e Https

mia configurazione:

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="AjaxBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceBehaviour"> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceMetadata httpGetEnabled="True" httpsGetEnabled="true"/>   
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    <services> 
     <service behaviorConfiguration="MyServiceBehaviour" name="MyService.Lookups"> 
     <endpoint address="" behaviorConfiguration="AjaxBehavior" 
      binding="webHttpBinding" bindingConfiguration="httpWebBinding" contract="MyService.Lookups" >   
     </endpoint> 
     <endpoint address="" behaviorConfiguration="AjaxBehavior" 
      binding="webHttpBinding" bindingConfiguration="httpsWebBinding" contract="MyService.Lookups" >   
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <bindings>  
     <webHttpBinding> 
     <binding name="httpsWebBinding"> 
      <security mode="Transport"> 
      <transport clientCredentialType="None" proxyCredentialType="None" /> 
      </security> 
     </binding> 
     <binding name="httpWebBinding"> 
      <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" /> 
      </security> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    </system.serviceModel> 

Navigazione https://myserver/services/Lookups.svc/Hello

Impossibile trovare un indirizzo di base che corrisponde schema http per l'endpoint con il legame webHttpBinding. schemi di indirizzo base registrata sono [https]

Navigazione http://myserver/services/Lookups.svc/Hello

Impossibile trovare un indirizzo di base che corrisponde schema HTTPS per l'endpoint con il legame webHttpBinding. Gli schemi di indirizzi di base registrati sono [http]

Se rimuovo un qualsiasi endpoint funziona. Esempio di rimozione dell'endpoint configurato con bindingConfiguration="httpWebBinding" per HTTPS,

Come posso farlo funzionare con HTTP e HTTPS? A partire da ora, posso usare http o https rimuovendo un endpoint.

Riferito How can I combine the WCF services config for both http and https in one web.config? e How do you setup HTTP and HTTPS WCF 4 RESTful services?

Nota: In IIS, si tratta di due siti web un ascolto su http e un altro sul https. Entrambi condividono lo stesso codice nella cartella fisica

UPDATE: A partire da ora, ho rimosso gli endpoint e funziona. Ma la mia preoccupazione è la rimozione di endpoing configurato con comportamentConfigurazione non sembra un'ottima soluzione per me.

Questo funziona sia per http & https

<services> 
     <service behaviorConfiguration="MyServiceBehaviour" name="MyService.Lookups"> 

     </service> 
    </services> 
+1

con 'httpsGetEnabled =" true "' ci deve essere un url 'https', ma non ne è stato definito alcuno. –

risposta

4

Ho ricreato lo scenario e usato il tuo web.config per configurare gli endpoint per il mio servizio di prova. La tua configurazione è ok e funziona correttamente. La parte che non funziona per te è probabilmente la tua configurazione https in IIS. Assicurati di aver abilitato l'accesso https al tuo servizio. Se si esegue il test con IISExpress da Visual Studio, fare clic con il tasto sinistro del mouse sul progetto e nella finestra delle proprietà (Visualizza -> Finestra Proprietà) selezionare SSL Abilitato = Vero.

+0

Sì. Nel server, abbiamo creato l'associazione 'https' e inserito un certificato autofirmato. Poiché non utilizziamo l'autenticazione reciproca, non abbiamo abilitato il flag 'RequireSSL' nelle impostazioni SSL in IIS 8.5 – Billa

0

Come ha sottolineato @Lesmian nella sua risposta, il problema è nella configurazione di IIS. In particolare in:

Nota: In IIS, si tratta di due siti web un ascolto su http e un altro su https. Entrambi condividono lo stesso codice nella cartella fisica

Il motivo è che IIS non può gestire endpoint su uno schema che non supporta.

Si dispone di due siti e uno di essi ha l'associazione HTTP ma non ha HTTPS e l'altro ha HTTPS ma non HTTP.

Quindi, quando si passa a http: // URL, IIS si indirizza al sito http abilitato, si legge web.config, vede che registra https endpoint (che non è supportato da (sorpresa!) il sito) e genera l'eccezione indicando che non è disponibile il supporto dello schema https nel sito http: -enabled-only.

durante l'esplorazione alle https: // URL la situazione è simile - IIS non consente di utilizzare http endpoint sulla https -enabled-unico sito .

Per gestire il problema è meglio utilizzare un singolo sito con due associazioni.

Un'altra opzione (e più complesso) sarebbe utilizzando diversi web.configs per i siti: creare siti separati (indicato per separare le cartelle) e utilizzare gli strumenti di pubblicazione e web.config trasformante del Visual Studio

0

Se di aggiornare i file di configurazione dell'endpoint come tale:

 <endpoint address="http://myserver/services/Lookups.svc" behaviorConfiguration="AjaxBehavior" 
      binding="webHttpBinding" bindingConfiguration="httpWebBinding" contract="MyService.Lookups" >   
     </endpoint> 
     <endpoint address="https://myserver/services/Lookups.svc" behaviorConfiguration="AjaxBehavior" 
      binding="webHttpBinding" bindingConfiguration="httpsWebBinding" contract="MyService.Lookups" >   
     </endpoint> 

ho fatto una danza simile con un sistema prod, e questa era la mia soluzione. Spero che funzioni anche per te.

0

Aggiungere questo codice.

<protocolMapping> 
    <add scheme="http" binding="webHttpBinding" bindingConfiguration="httpWebBinding"/> 
    <add scheme="https" binding="webHttpBinding" bindingConfiguration="httpsWebBinding"/> 
</protocolMapping> 
Problemi correlati