Usuário com melhor resposta
Urgente! Self-Host com vários serviços

Pergunta
-
Amigos,Estou fazendo uma pequena aplicação para consumir alguns serviços do WCF. Ao criar a aplicação console que será o host, fiz a configuração do endpoint de um servico no arquivo app.config e o consumo deste serviço está funcionando perfeitamente.Segue abaixo a configuração atual do app.config:<?xml version="1.0" encoding="utf-8" ?><configuration><system.diagnostics><sources><source name="System.ServiceModel"switchValue="Off"propagateActivity="true"><listeners><add name="HostLogging"type="System.Diagnostics.XmlWriterTraceListener"initializeData="C:\Temp\HostLogging.svclog" /></listeners></source><source name="System.ServiceModel.MessageLogging"><listeners><add name="MessageHostLogging"type="System.Diagnostics.XmlWriterTraceListener"initializeData="C:\Temp\MessageHostLogging.svclog" /></listeners></source></sources></system.diagnostics><system.serviceModel><diagnostics><messageLogginglogEntireMessage="true"logMalformedMessages="true"logMessagesAtServiceLevel="true"logMessagesAtTransportLevel="true"maxMessagesToLog="100"maxSizeOfMessageToLog="2000"></messageLogging></diagnostics><services><service name="WCFVides.Servico.ServicoDeGestaoDeCredito"behaviorConfiguration="ServiceConfig"><host><baseAddresses><add baseAddress="net.tcp://localhost:9876"/><add baseAddress="http://localhost:8766"/></baseAddresses></host><endpoint address="srv"binding="netTcpBinding"contract="WCFVideos.Contratos.IGestorDeCredito" /><endpoint address="srv"binding="wsDualHttpBinding"contract="WCFVideos.Contratos.IGestorDeCredito" /><endpoint address="mex"binding="mexHttpBinding"contract="IMetadataExchange" /></service></services><behaviors><serviceBehaviors><behavior name="ServiceConfig"><serviceMetadata httpGetEnabled="true"/><!--<serviceDebug includeExceptionDetailInFaults="true"/>--></behavior></serviceBehaviors></behaviors></system.serviceModel></configuration>E aqui está como eu estou abrindo o host no evento Main da aplicação console:using (ServiceHost host = new ServiceHost(typeof(ServicoDeGestaoDeCredito), new Uri[] { })){host.Open();Console.ReadLine();}Bom, agora eu preciso acrescentar mais serviços que chama ServicoGrupoProduto e vão existir muitos outros quando a aplicação estiver completa. Então segue abaixo as minhas dúvidas:1) Configuração do arquivo app.config:Para cada serviço a ser publicado, eu terei que repetir as configurações acima desta forma:
<?xml version="1.0" encoding="utf-8" ?><configuration><system.serviceModel><services><service name="WCFNefi.Servicos.ServicoGrupoProduto" behaviorConfiguration="ServiceConfig"><host><baseAddresses><add baseAddress="net.tcp://localhost:9876"/><add baseAddress="http://localhost:8766"/></baseAddresses></host><endpoint address="srv"binding = "netTcpBinding"contract = "WCFNefi.Contratos.IGrupoProduto"/><endpoint address="srv"binding="wsDualHttpBinding"contract="WCFNefi.Contratos.IGrupoProduto"/><endpoint address="mex"binding="mexHttpBinding"contract="IMetadataExchange"/></service>******** Novo serviço acrescentado no arquivo *********<service name="WCFNefi.Servicos.ServicoProduto" behaviorConfiguration="ServiceConfig"><host><baseAddresses><add baseAddress="net.tcp://localhost:9876"/><add baseAddress="http://localhost:8766"/></baseAddresses></host><endpoint address = "srv"binding = "netTcpBinding"contract = "WCFNefi.Contratos.IProduto"/><endpoint address = "srv"binding = "wsDualHttpBinding"contract = "WCFNefi.Contratos.IProduto"/><endpoint address="mex"binding="mexHttpBinding"contract="IMetadataExchange"/></service></services>É assim que se faz?2) Configuração do evento Main da aplicação Console:Se realmente a configuração acima do arquivo app.config estiver certa, como eu faço no evento main da aplicação console para expor todos estes serviços, para que eu possa adicionar a referencia deles na aplicação cliente? Terei que criar uma instância de um host para cada serviço neste evento?Espero ter conseguido explicar as minhas dúvidas e agradeço a todos que puderem ajudar.
Respostas
-
Boas Marcelos,
Sim, cada ServiceHost gerencia um único serviço. Você precisa ter mais instâncias dele para cada serviço, e além disso, cada serviço precisa também ter suas respectivas configurações no arquivo de configuração, como endpoints, bindings, etc.
http://www.israelaece.com- Marcado como Resposta Marcelos de Oliveiras segunda-feira, 8 de março de 2010 14:04
-
Boas Marcelos,
Acredito que o problema seja porque está utilizando a mesma porta (endereço) entre os serviços. Tente variar isso.
http://www.israelaece.com- Marcado como Resposta Israel AeceModerator segunda-feira, 8 de março de 2010 22:27
Todas as Respostas
-
Boas Marcelos,
Sim, cada ServiceHost gerencia um único serviço. Você precisa ter mais instâncias dele para cada serviço, e além disso, cada serviço precisa também ter suas respectivas configurações no arquivo de configuração, como endpoints, bindings, etc.
http://www.israelaece.com- Marcado como Resposta Marcelos de Oliveiras segunda-feira, 8 de março de 2010 14:04
-
Caro Israel,Desculpe incomoda-lo novamente como este assunto. Se você puder ajudar novamente eu ficarei agradecido.No meu serviço host console, eu configurei dois serviços. Segue abaixo o conteúdo do arquivo app.config:<?xml version="1.0" encoding="utf-8" ?><configuration><system.serviceModel><services><service name="WCFNefi.Servicos.ServicoGrupoProduto" behaviorConfiguration="ServiceConfig"><host><baseAddresses><add baseAddress="http://localhost:8766"/></baseAddresses></host><endpoint address="srv"binding="basicHttpBinding"contract="WCFNefi.Contratos.IGrupoProduto"/><endpoint address="mex"binding="mexHttpBinding"contract="IMetadataExchange"/></service><service name="WCFNefi.Servicos.ServicoProduto" behaviorConfiguration="ServiceConfig"><host><baseAddresses><add baseAddress="http://localhost:8766"/></baseAddresses></host><endpoint address = "srv"binding = "basicHttpBinding"contract = "WCFNefi.Contratos.IProduto"/><endpoint address="mex"binding="mexHttpBinding"contract="IMetadataExchange"/></service></services><behaviors><serviceBehaviors><behavior name ="ServiceConfig"><serviceMetadata httpGetEnabled ="true"/><serviceDebug includeExceptionDetailInFaults="true"/></behavior></serviceBehaviors></behaviors></system.serviceModel></configuration>No método Main da aplicação console eu estou instanciado o host para cada serviço desta forma:ServiceHost hostGrupoProduto = new ServiceHost(typeof(ServicoGrupoProduto), new Uri[] {});ServiceHost hostProduto = new ServiceHost(typeof(ServicoProduto), new Uri[] { });hostProduto.Open();hostGrupoProduto.Open();Console.ReadLine();hostGrupoProduto.Close();hostProduto.Close();Pois bem, quanto o programa inicia e chega nesta linha "hostGrupoProduto.Open();" ele exibe esta mensagem de erro: O ChannelDispatcher em 'http://localhost:8766/srv' com contrato(s) '"IGrupoProduto"' não consegue abrir sua IChannelListener..Por favor, é possível você informar o que eu estou fazendo errado?Um forte abraço!
-
Boas Marcelos,
Acredito que o problema seja porque está utilizando a mesma porta (endereço) entre os serviços. Tente variar isso.
http://www.israelaece.com- Marcado como Resposta Israel AeceModerator segunda-feira, 8 de março de 2010 22:27
-
Grande Israel!Funcionou legal quando alterei a porta! Obrigado.Como você tem muita experiência nisso, por favor me diga se isso é possível:Como na minha aplicação eu vou ter muitos serviços, e pelo jeito cada um tem que estar em uma porta diferente, há como aparecer todos os serviços de uma vez na janela Add Service Reference? Ou terei que informar o endereço de cada um com a sua respectiva porta?Um forte abraço!
-
Boas Marcelos,
Sim, terá que informar um por um. Até onde sei, esta opção somente lista o que há disponível em uma determinada URL.
http://www.israelaece.com