2010-03-09 5 views
5

Sto eseguendo un servizio WCF dall'interno di un exe (per il debug, verrà spostato al servizio Windows quando distribuito) Tuttavia, ho ricevuto un servizio in esecuzione correttamente all'interno di esso quando eseguo un secondo servizio ottengo l'eccezioneImpossibile avviare il servizio WCF quando è disponibile più di un servizio

System.InvalidOperationException was unhandled 
    Message=The ChannelDispatcher at 'http://backupsvr:8082/' with contract(s) '"IHttpGetHelpPageAndMetadataContract"' is unable to open its IChannelListener. 
    Source=System.ServiceModel 
    StackTrace: 
     at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) 
     at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
     at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) 
     at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
     at System.ServiceModel.Channels.CommunicationObject.Open() 
     at Service.Program.Main() in E:\Visual Studio 2010\Projects\Contract Flow Suite\Service\Program.cs:line 30 
    InnerException: System.InvalidOperationException 
     Message=A registration already exists for URI 'http://backupsvr:8082/'. 
     Source=System.ServiceModel 
     StackTrace: 
      at System.ServiceModel.Channels.UriPrefixTable`1.RegisterUri(Uri uri, HostNameComparisonMode hostNameComparisonMode, TItem item) 
      at System.ServiceModel.Channels.HttpTransportManager.Register(TransportChannelListener channelListener) 
      at System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener) 
      at System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback) 
      at System.ServiceModel.Channels.TransportChannelListener.OnOpen(TimeSpan timeout) 
      at System.ServiceModel.Channels.HttpChannelListener.OnOpen(TimeSpan timeout) 
      at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
      at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) 
     InnerException: 

ecco il codice che lo chiama.

using(ServiceHost hostRemoteUserManager = new ServiceHost(typeof(RemoteUserManager))) 
using(ServiceHost hostDatabaseManagement = new ServiceHost(typeof(DatabaseManagement))) 
try 
{ 
    // Open the ServiceHost to start listening for messages. 
    hostRemoteUserManager.Open(); 
    hostDatabaseManagement.Open(); //Exception on this line. 
    // The service can now be accessed. 
    Console.WriteLine("The service is ready."); 
    Console.WriteLine("Press <ENTER> to terminate service."); 
    Console.ReadLine(); 

    // Close the ServiceHost. 
    hostRemoteUserManager.Close(); 
    hostDatabaseManagement.Close(); 
} 

E qui è il mio file App.config Ho usato il Service Configuration Editor in Visual Studio 2010 per crearlo.

REMOVED 

Cosa ho bisogno di cambiare nel mio file App.config per consentire più di un servizio diverso da loro in esecuzione su porte diverse. Vorrei interrogare http://backupsvr:8082/ e fargli elencare tutti i servizi disponibili quando uso lo strumento "Aggiungi servizio di aggiornamento".

AGGIORNAMENTO -

ho fatto il suggerimento di Igor ora gira su stessa porta però nella finestra di refrence servizio Add ho ancora bisogno di digitare http://backupsvr:8082/RemoteUserManager e http://backupsvr:8082/DatabaseManagement invece di un solo http://backupsvr:8082/. Non so se ciò che sto volendo è possibile, sembra che sia il modo in cui dovrebbe essere il modo in cui è progettato il dialogo. qui è una copia di aggiornamento del mio app.config file di

<?xml version="1.0"?> 
<configuration> 
<system.diagnostics> 
<sources> 
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Off,ActivityTracing"> 
    <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
     <filter type="" /> 
     </add> 
    </listeners> 
    </source> 
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing"> 
    <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
     <filter type="" /> 
     </add> 
    </listeners> 
    </source> 
</sources> 
</system.diagnostics> 
<system.serviceModel> 
<bindings> 
    <mexHttpBinding> 
    <binding name="MexBinding" /> 
    </mexHttpBinding> 
</bindings> 
<diagnostics> 
    <messageLogging logMalformedMessages="false" logMessagesAtServiceLevel="false" 
    logMessagesAtTransportLevel="false" /> 
</diagnostics> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="RemoteUserManagerBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
    </behavior> 
    <behavior name="DatabaseManagementBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service behaviorConfiguration="RemoteUserManagerBehavior" name="Service.RemoteUserManager"> 
    <endpoint address="" binding="netTcpBinding" 
     bindingConfiguration="" name="RemoteUserManagerBinding" contract="Service.IRemoteUserManager" /> 
    <endpoint address="mex" binding="mexHttpBinding" 
     bindingConfiguration="MexBinding" name="RemoteUserManagerMetadata" 
     contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://backupsvr:8082/RemoteUserManager" /> 
     <add baseAddress="net.tcp://backupsvr:8081/RemoteUserManager" /> 
     </baseAddresses> 
    </host> 
    </service> 
    <service behaviorConfiguration="DatabaseManagementBehavior" name="Service.DatabaseManagement"> 
    <endpoint address="" binding="netTcpBinding" 
     bindingConfiguration="" name="DatabaseManagementBinding" contract="Service.IDatabaseManagement" /> 
    <endpoint address="mex" binding="mexHttpBinding" 
     bindingConfiguration="MexBinding" name="DatabaseManagementMetaData" 
     contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://backupsvr:8082/DatabaseManagement" /> 
     <add baseAddress="net.tcp://backupsvr:8081/DatabaseManagement" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
</system.serviceModel> 
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration> 
+0

uso uno diverso baseaddress per ogni servizio e il secondo è impossibile avere più di un servizio su una porta (molti endpoint ma una porta per un'implementazione di servizio) – garik

+0

@Igor, Se si può avere solo un servizio perché si fa clic da un elenco di "servizi disponibili" quando si utilizzare aggiungere riferimento al servizio? –

+0

Per inchiodare l'errore, funziona quando si passa l'ordine delle 2 chiamate Open() o quando si esegue solo il 2 °? –

risposta

7

uso per il primo servizio

<baseAddresses> 
     <add baseAddress="net.tcp://backupsvr:8082/IRemoteUserManager"/> 
    </baseAddresses> 

uso per il secondo servizio

<baseAddresses> 
     <add baseAddress="net.tcp://backupsvr:8082/IDatabaseManagement"/> 
    </baseAddresses> 

indirizzi dovrebbe essere unico

+1

Hai ragione, anche se capisco la domanda di Scotts. Sembra inutile con la parte 'indirizzo' nella configurazione del servizio. Ho anche visto soluzioni con 2 numeri di porta diversi (8082, 8083) –

+0

Ora funziona con entrambi sulla stessa porta. Tuttavia devo chiamare http: // backupsvr: 8082/DatabaseManagement e http: // backupsvr: 8082/RemoteUserManager per ottenere le loro interfacce. Mi piacerebbe se potessi chiamare la radice e farli apparire entrambi. Aggiornerò la pubblicazione originale con le mie modifiche. –

+0

Non l'ho mai provato, voglio che tu implementi entrambe le interfacce di una classe MySuperManagement. Usando in questo modo potrebbe essere fatto, immagino. :). Qualsiasi modo in cui i client dei servizi Web dovrebbero capire quale servizio utilizzare su quella porta/indirizzo (utilizzare porte diverse o indirizzi diversi). – garik