2009-09-12 7 views
5

Per impostazione predefinita IIS 7 sito Web ha net.tcp vincolante con: stringa di informazioni di associazione "808 ". Se aggiungo un'altra associazione net.tcp con "xxx:" si verifica un'eccezione:Hosting servizio WCF in IIS 7 (WAS) con rilegatura net.tcp su due porte TCP

Questa raccolta contiene già un indirizzo con schema net.tcp. Ci può essere al massimo un indirizzo per schema in questa raccolta. Nome parametro: articolo

Come posso risolvere questo problema e ascoltare il mio servizio presso due porte?

risposta

8

Fondamentalmente, nel tuo servizio, dovresti essere in grado di definire qualsiasi numero di endpoint di servizio su un numero qualsiasi di porte.

Ci sono due modi per farlo:

  • definire un indirizzo di base e un indirizzo relativo nel endpoint del servizio
  • definire il indirizzo completo in ciascun endpoint

Se fai l'opzione n. 1, avrai qualcosa del genere:

<service name="YourService"> 
    <host> 
    <baseAddresses> 
     <add baseAddress="net.tcp://YourServer:5151/Services" /> 
    </baseAddresses> 
    </host> 
    <endpoint name="endpoint1" 
      address="Service1" 
      binding="netTcpBinding" 
      contract="IYourService" /> 
    <endpoint name="endpoint2" 
      address="Service2" 
      binding="netTcpBinding" 
      contract="IYourService" /> 
</service> 

Quindi, in questo caso, si hanno due endpoint del servizio per lo stesso contratto, e saranno in ascolto su URL

net.tcp://YourServer:5151/Services/Service1 

e

net.tcp://YourServer:5151/Services/Service2 

si può avere endpoint del servizio mulitple, ma solo un indirizzo di base.

L'altra opzione è quella di specificare nessun indirizzo di base e specificare il proprio indirizzo di servizio completo nel endpoint direttamente:

<service name="YourService"> 
    <endpoint name="endpoint1" 
      address="net.tcp://YourServer:5151/Services/Service1" 
      binding="netTcpBinding" 
      contract="IYourService" /> 
    <endpoint name="endpoint2" 
      address="net.tcp://YourServer:6868/Services/Service2" 
      binding="netTcpBinding" 
      contract="IYourService" /> 
</service> 

In questo caso, dal momento che si sta definendo l'intero indirizzo nell'endpoint, è possibile scegliere due diverse porte TCP, una per ciascun endpoint. Questo dovrebbe funzionare senza problemi. Si hanno due endpoint separati su due porte separate, sia in ascolto che in fase di manutenzione dalla stessa classe di servizio in background.

Marc

+1

Ho letto da qualche parte che BaseAddresses viene ignorato in un ambiente di intrattenimento. – Konstantin

+0

Sarò d'accordo con il tuo commento e fornirò un link che dice così. Quando si tratta di IIS, gli indirizzi di base sono fondamentalmente ignorati, ma l'esempio sopra rimane valido a causa degli indirizzi dei punti finali forniti. Vengono utilizzati implicitamente con le informazioni sul bind del sito in IIS. http://msdn.microsoft.com/en-us/magazine/cc163412.aspx – dyslexicanaboko

0

Sono di nuovo io.

Questo funziona con sé ospite

<baseAddresses> 
      <add baseAddress="net.tcp://localhost" /> 
      <add baseAddress="net.tcp://localhost:12345" /> 
</baseAddresses> 

ma con IIS7 + è stato un'eccezione causa

Impossibile connettersi al net.tcp: // localhost: 12345/game2.svc. Il tentativo di connessione è durato per un periodo di 00: 00: 02.0936160. Codice di errore TCP 10061: non è stato possibile effettuare alcuna connessione poiché la macchina di destinazione lo ha rifiutato attivamente 127.0.0.1:12345.

La domanda era su IIS ambiente di hosting

2

stavo cercando di deply un servizio WCF ad uno dei miei server web l'altro giorno e ha incontrato un problema.Ho ricevuto il seguente messaggio di errore: p>

Questa raccolta contiene già un indirizzo con schema http. Ci può essere al massimo un indirizzo per schema in questa collezione. Nome parametro: articolo

Il problema non si è verificato sulla mia macchina locale ma sul server Web, rendendo un po 'difficile capire cosa lo causasse. È successo sul server perché il mio server web si trova in un ambiente di hosting condiviso, nel qual caso anche il servizio WCF deve conoscere l'intestazione host. Per fare questo ho navigato nel web.config e aggiunto quanto segue:

<serviceHostingEnvironment> 
<baseAddressPrefixFilters>  
    <add prefix=http://MyHostHeader /> 
</baseAddressPrefixFilters> 
</serviceHostingEnvironment> 
+1

In .NET 4.0 questo viene risolto tramite