2010-03-09 24 views
5

Estoy ejecutando un servicio WCF desde un exe (para la depuración, se moverá al servicio de Windows cuando se implemente) Obtuve un servicio dentro de él sin embargo cuando ejecuto un segundo servicio recibo la excepciónEl servicio WCF no se puede iniciar cuando hay más de un servicio disponible

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: 

aquí está el código que lo llama.

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(); 
} 

Y aquí es mi archivo App.config He utilizado el editor de configuración de servicio en Visual Studio 2010 para crearlo.

REMOVED 

¿Qué necesito cambiar en mi archivo app.config para permitir que más de un servicio que no sea ejecutarlas en diferentes puertos. Me gustaría consultar http://backupsvr:8082/ y hacer que enumere todos los servicios disponibles cuando utilizo la herramienta "Agregar servicio de referencia".

ACTUALIZACIÓN -

hice la sugerencia de Igor ahora se ejecuta en el mismo puerto sin embargo, en el cuadro de diálogo Agregar servicio refrence todavía tengo que escribir en http://backupsvr:8082/RemoteUserManager y http://backupsvr:8082/DatabaseManagement INSTED de un solo http://backupsvr:8082/. No sé si lo que quiero es posible, parece que así es como debe ser el diseño del diálogo. aquí está una copia de actualización de mi app.config archivo

<?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 diferente baseaddress para cada servicio y segundo es imposible tener más de un servicio en un puerto (muchos puntos finales pero un puerto para una implementación de servicio) – garik

+0

@Igor, si solo puede tener un servicio, ¿por qué hace clic de una lista de "servicios disponibles" cuando usar agregar referencia de servicio? –

+0

Para determinar el error, ¿funciona cuando cambia el orden de las 2 llamadas abiertas(), o cuando solo ejecuta el segundo? –

Respuesta

7

uso para el primer servicio

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

uso para el segundo servicio

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

direcciones debe ser único

+1

Tienes razón, aunque entiendo la pregunta de Scotts. Parece innecesario con la parte 'dirección' en la configuración del servicio. También he visto soluciones con 2 números de puerto diferentes (8082, 8083) –

+0

Ahora se ejecuta con ambos en el mismo puerto. Sin embargo, tengo que llamar a http: // backupsvr: 8082/DatabaseManagement y http: // backupsvr: 8082/RemoteUserManager para obtener sus interfaces. Me gustaría si pudiera llamar a la raíz y hacer que aparezcan los dos. Actualizaré la publicación original con mis cambios. –

+0

Nunca lo he intentado, quiero que implemente ambas interfaces en una clase MySuperManagement. Al usar de esta manera podría hacerse, supongo. :). De cualquier forma, los clientes de sus servicios web deberían entender qué servicio usar en ese puerto/dirección (usar diferentes puertos o diferentes direcciones). – garik

Cuestiones relacionadas