Errore di avvio del servizio WCF "Questa raccolta contiene già un indirizzo con schema http"


182

Ho creato un'applicazione Web contenente un contratto di servizio WCF e un controllo Silverlight che effettua chiamate a quel servizio WCF. Sui miei server di sviluppo e test funziona alla grande.

Quando eseguo la distribuzione sul nostro server live ed eseguo l'applicazione, ricevo un'eccezione di tipo System.ServiceModel.ServiceActivationExceptionche indica che il servizio non può essere attivato a causa di un'eccezione durante la compilazione. L'eccezione è:

Questa raccolta contiene già un indirizzo con schema http. In questa raccolta può esserci al massimo un indirizzo per schema.

Ho letto che questa eccezione può essere generata se il sito web ha più di un'intestazione host, il che è vero sul nostro server live. Apparentemente i servizi WCF ospitati in IIS possono avere un solo indirizzo di base. Come posso aggirare questo problema?

Risposte:


167

In .Net 4, è possibile utilizzare l' multipleSiteBindingsEnabledopzione:

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
</system.serviceModel>

Quindi, non dovrai specificare ciascun indirizzo.

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx


Sì, ma funziona solo con .NET 4.0 e versioni successive. Non è possibile utilizzarlo con i siti .NET 2.0 / 3.0 / 3.5.
Bytemaster

2
Nota - c'è un refuso qui - non c'è chiusura>, quindi se copi e incolli, avrai problemi
sydneyos

2
Non funzionerà per questa domanda: "Questa funzionalità è disponibile solo utilizzando il protocollo HTTP."
George Tsiokos,

146

Sommario,

Soluzione di codice: qui

Soluzioni di configurazione: qui

Con l'aiuto di Mike Chaliy , ho trovato alcune soluzioni su come farlo attraverso il codice. Poiché questo problema interesserà praticamente tutti i progetti che implementiamo in un ambiente live che ho offerto per una soluzione di pura configurazione. Alla fine ne ho trovato uno che spiega come farlo in .net 3.0 e .net 3.5.

Tratto dal sito, di seguito è riportato un esempio di come modificare la configurazione Web delle applicazioni:

<system.serviceModel>
    <serviceHostingEnvironment>
        <baseAddressPrefixFilters>
            <add prefix="net.tcp://payroll.myorg.com:8000"/>
            <add prefix="http://shipping.myorg.com:9000"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
</system.serviceModel>

Nell'esempio sopra, net.tcp: //payroll.myorg.com: 8000 e http://shipping.myorg.com:9000 sono gli unici indirizzi di base, per i rispettivi schemi, ai quali sarà consentito il passaggio. BaseAddressPrefixFilter non supporta i caratteri jolly.

Gli indirizzi di base forniti da IIS possono avere indirizzi associati ad altri schemi non presenti nell'elenco baseAddressPrefixFilter. Questi indirizzi non verranno filtrati.

Soluzione DNS (non testata): penso che se si creasse una nuova voce DNS specifica per l'applicazione Web, si aggiungesse un nuovo sito Web e si fornisse un'unica intestazione host corrispondente alla voce DNS, si mitigerebbe del tutto il problema e non si scrivere codice personalizzato o aggiungere prefissi al file web.config.


2
L'aggiunta del filtro prefisso dell'indirizzo di base a web.config ha funzionato perfettamente. Grazie Jeremy!
Mike737,

2
Non riesco a pensare a nessun motivo per cui si vorrebbe una simile restrizione, tanto meno l'impostazione predefinita ...
pbz,

42
Sto iniziando a pensare male a WCF in combinazione con ASP.net e servizi Web a cui si accede tramite JavaScript. Ho avuto molti meno problemi con i semplici vecchi servizi ASMX ...
Juri,

Ok cosa succede se hai un sito con un mix di applicazioni .net 4 e .net 2 in esecuzione sotto di esso. La base dell'applicazione è .net4 e vi sono diverse applicazioni che richiedono .net2. Usi <serviceHostingEnvironment multipleSiteBindingsEnabled = "true"> in tutti i file .net4 e il prefisso nelle applicazioni .net 2?
Travis,

59

Hai visto questo - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx

È possibile risolvere questo errore modificando il file web.config.

Con ASP.NET 4.0, aggiungi le seguenti righe al tuo web.config:

<system.serviceModel> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

Con ASP.NET 2.0 / 3.0 / 3.5, aggiungi le seguenti righe al tuo web.config:

<system.serviceModel> 
     <serviceHostingEnvironment> 
          <baseAddressPrefixFilters> 
               <add prefix="http://www.YourHostedDomainName.com"/> 
          </baseAddressPrefixFilters> 
     </serviceHostingEnvironment> 
</system.serviceModel> 

Grazie. Continuerò a cercare per vedere se esiste una soluzione non di codice. Qualcosa che può essere fatto nella configurazione perché questo influenzerà qualsiasi progetto che facciamo spero di non dover scrivere codice personalizzato.
Jeremy,

16

Nel mio caso, la causa principale di questo problema è stata la presenza di più collegamenti http definiti nel sito Web principale, ad esempio InetMgr-> Sites-> Mysite-> properties-> EditBindings. Ho eliminato un binding http che non era richiesto e il problema è stato risolto.


1
Sì, questo è stato molto utile - nel mio caso è stato UN ALTRO sito Web con più attacchi che lo ha rotto. Disponibile esternamente sullo stesso computer (ma con un nome host diverso). Allo stesso modo, potrebbe essere corretto aggiungendo l'impostazione multipleSiteBindingsEnabled, ma web.config sarebbe diverso da tutti gli altri ambienti.
The Coder,

2
È un peccato che sia in fondo. Nel nostro caso, questo è stato risolto per noi.
brendonparker,

Mi ha aiutato a replicare l'errore nell'ambiente di sviluppo. Non riesco a modificare i collegamenti del sito Web né in certificazione né in ambienti live. Ho modificato il mio file hosts per simulare un dominio e aggiunto collegamenti a IIS e bam locali!
MFedatto

8

E nel mio caso è stato semplice: ho usato la procedura guidata 'Aggiungi servizio WCF' in Visual Studio, che ha creato automaticamente le sezioni corrispondenti in app.config. Poi ho continuato a leggere Come: ospitare un servizio WCF in un'applicazione gestita . Il problema era: non avevo bisogno di specificare l'URL per eseguire il servizio web.

Sostituire:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))

Con:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))

E l'errore è sparito.

Idea generica: se si fornisce l'indirizzo di base come parametro e lo si specifica in config, si ottiene questo errore. Molto probabilmente, non è l'unico modo per ottenere l'errore, tu.


Risolto il mio problema
QShengyao,

2

Ho avuto questo problema e la causa era piuttosto sciocca. Stavo provando la demo di Microsoft sull'esecuzione di un ServiceHost da w / in un eseguibile della riga di comando. Ho seguito le istruzioni, incluso dove si dice per aggiungere il servizio (e l'interfaccia) appropriato. Ma ho ricevuto l'errore sopra.

Risulta quando ho aggiunto la classe di servizio, VS ha aggiunto automaticamente la configurazione a app.config. E la demo stava cercando di aggiungere anche queste informazioni. Dato che era già nella configurazione, ho rimosso la parte demo e ha funzionato.


0

Sono arrivato con lo stesso errore su un vecchio Exchange Server 2010. Un servizio (servizio di replica delle cassette postali di Exchange) ha fornito l'errore sopra riportato e non è stato possibile continuare il processo di migrazione. Cercando attraverso internet, sono arrivato da questo link che ha dichiarato quanto segue:

Exchange GRE non si apre alla prima installazione o in caso di modifiche al server IIS. Non riesce con errore di snap-in e quando si tenta di aprire la pagina di snap-in, viene visualizzato il seguente contenuto:

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'."

Causa : questo errore si verifica perché il numero di porta http 443 è già in uso da un'altra applicazione e il server IIS non è configurato per gestire l'associazione multipla alla stessa porta.

Soluzione : configurare il server IIS per gestire più collegamenti di porta. Contattare il fornitore (Microsoft) per configurarlo.

Poiché questi servizi sono stati offerti da un server Web IIS, il controllo dei collegamenti sul sito principale ha risolto il problema. Qualcuno aveva incasinato i collegamenti del sito, definendo le regole che si sovrapponevano e incasinava i servizi.

La correzione dei collegamenti corretti ha risolto il problema, nel mio caso, e non ho dovuto configurare Web.Config.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.