2009-05-16 23 views
33

Sto provando a distribuire un servizio WCF sul mio server, ospitato in IIS. Naturalmente funziona sulla mia macchina :)Come risolvere "impossibile trovare un indirizzo di base che corrisponda allo schema http" ... in WCF

Ma quando schiero esso, ottengo il seguente errore:

This collection already contains an address with scheme http. There can be at most one address per scheme in this collection.

Googling su questo, trovo che devo mettere un elemento serviceHostingEnvironment nel web.config File:

<serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
    <add prefix="http://mywebsiteurl"/> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

Ma una volta che ho fatto questo, ho il seguente:

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

Sembra che non sappia quale sia l'indirizzo di base, ma come faccio a specificarlo? Ecco la sezione del mio file web.config:

<system.serviceModel> 
    <serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
     <add prefix="http://mywebsiteurl"/> 
    </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name="WcfPortalBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="BasicHttpBinding_IWcfPortal" 
       maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" 
       receiveTimeout="00:10:00" sendTimeout="00:10:00" 
       openTimeout="00:10:00" closeTimeout="00:10:00"> 
     <readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647" 
       maxStringContentLength="2147483647"/> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 

    <services> 
    <service behaviorConfiguration="WcfPortalBehavior" name="Csla.Server.Hosts.Silverlight.WcfPortal"> 
     <endpoint address="" binding="basicHttpBinding" contract="Csla.Server.Hosts.Silverlight.IWcfPortal" 
     bindingConfiguration="BasicHttpBinding_IWcfPortal"> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
    </services> 
</system.serviceModel> 

Qualcuno può far luce su ciò che sta succedendo e come risolvere il problema?

+0

Hey Craig, avete risolto questo problema? Per favore fatemi ... Ora sto affrontando lo stesso problema :( – Lamps

+0

qualsiasi soluzione definitiva a questo proposito? – Kiquenet

risposta

4

Qualche possibilità che IIS sia configurato per richiedere SSL sulle connessioni al proprio sito/applicazione?

+0

sto ottenendo questo stesso errore, @tomasr e IIS è configurato per richiedere SSL. Sarà questo un problema? C'è un modo ? intorno a questo – StatsStudent

0

Se è ospitato in IIS, non è necessario specificare un indirizzo di base, sarà l'indirizzo della directory virtuale.

+0

allora come risolvere il problema del PO ?? –

0

Ci dovrebbe essere un modo per risolvere questo abbastanza facilmente con le sezioni di configurazione esterne e una fase di implementazione extra che elimina un file .config esterno specifico per la distribuzione in una posizione nota. Solitamente utilizziamo questa soluzione per gestire le diverse configurazioni del server per i nostri diversi ambienti di distribuzione (Staging, QA, produzione, ecc.) Con la nostra "dev box" che è l'impostazione predefinita se non si verifica alcuna copia speciale.

0

confermato la mia correzione:

Nel file web.config è necessario configurarlo per apparire come tale:

<system.serviceModel > 
    <serviceHostingEnvironment configSource=".\Configurations\ServiceHosting.config" /> 
    ... 

Poi, costruire una struttura di cartelle che assomiglia a questo:

/web.config 
/Configurations/ServiceHosting.config 
/Configurations/Deploy/ServiceHosting.config 

Il serviceHosting.config base dovrebbe assomigliare a questo:

<?xml version="1.0"?> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
    <baseAddressPrefixFilters> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

mentre quello in/Deploy assomiglia a questo:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
    <baseAddressPrefixFilters> 
     <add prefix="http://myappname.web707.discountasp.net"/> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

Al di là di questo, è necessario aggiungere un passaggio distribuzione manuale o automatica per copiare il file da/Distribuire sovrastano quella in/configurazioni. Questo funziona incredibilmente bene per l'indirizzo di servizio e le stringhe di connessione, e fa risparmiare sforzi nel fare altri workaround.

Se non ti piace questo approccio (che si adatta bene alle farm, ma è più debole su una singola macchina), potresti considerare l'aggiunta di un file web.config di livello superiore rispetto alla distribuzione del servizio sulla macchina dell'host e mettere la servizioHostingEnvironment nodo lì. Dovrebbe cascatarti per te.

4

Se si desidera utilizzare baseAddressPrefixFilters in web.config, è necessario anche impostare IIS (6). Questo mi ha aiutato:

1/In IIS trova il tuo sito. 2/Proprietà/Sito Web (scheda)/Indirizzo IP -> Pulsante avanzato 3/Aggiungi nuova intestazione host sulla stessa porta che verrà utilizzata in web.config.

37

Provare a cambiare la modalità di protezione da "Trasporto" a "Nessuno".

 <!-- Transport security mode requires IIS to have a 
      certificate configured for SSL. See readme for 
      more information on how to set this up. --> 
     <security mode="None"> 
+0

Molto bene -!? stavo cambiando un endpoint da https a http solo per il debug locale e si è dimenticato di cambiare la modalità di protezione = "Trasporti" per modalità di sicurezza = "None" Risolto – atconway

4

Ho dovuto fare due cose per la configurazione IIS del sito/dell'applicazione. Il mio problema aveva a che fare con ottenere net.tcp lavoro in un IIS Web App sito:

Primo:

  1. fare clic destro sul nome di IIS App.
  2. Gestione sito Web
  3. Impostazioni avanzate
  4. Set Enabled protocolli da "http, net.tcp"

Secondo:

  1. Sotto il menu Azioni sul lato destro della Manager, fare clic su Bindings ...
  2. Fare clic su Aggiungi
  3. Cambia tipo in "net.tcp"
  4. Set Informazioni legame {numero porta} aperta: *
  5. OK
2

Solo il primo indirizzo di base nella lista verrà preso in consegna (provenienti da IIS). Non è possibile avere più indirizzi di base per schema prima di .NET4.

1

La soluzione è quella di definire un legame all'interno del vostro file web.config personalizzato e impostare la modalità di sicurezza a "Trasporto". Quindi è sufficiente utilizzare la proprietà bindingConfiguration all'interno della definizione dell'endpoint per puntare al binding personalizzato.

vedere qui: Scott's Blog: WCF Bindings Needed For HTTPS

Problemi correlati