none
Urgente! Self-Host com vários serviços RRS feed

  • 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>
          <messageLogging
            logEntireMessage="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.


    sábado, 6 de março de 2010 21:29

Respostas

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
    segunda-feira, 8 de março de 2010 00:42
    Moderador
  • 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!

    segunda-feira, 8 de março de 2010 19:50
  • 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
    segunda-feira, 8 de março de 2010 20:01
    Moderador
  • 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!
    segunda-feira, 8 de março de 2010 20:54
  • 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
    segunda-feira, 8 de março de 2010 22:28
    Moderador