none
Criando um Serviço com WCF na configuração declarativa RRS feed

  • Pergunta

  • Boa Tarde,
    criei um serviço Windows e inicializo ele normalmente. Após isso, comecei a fazer as modificações necessárias para atender minhas necessidades.

    No serviço do windows, inseri o código:
            /// <summary>
            /// Construtor da classe
            /// </summary>
            public SecurityService()
            {
                InitializeComponent();//inicializo o componente
    
                m_services = new List<ServiceHost>();//inicializo a lista de serviços;
            }
    
            /// <summary>
            /// Chamada de inicialização do serviço
            /// </summary>
            /// <param name="args">Argumentos de inicialização</param>
            protected override void OnStart(string[] args)
            {
                ServiceHost host;//crio o host
                //Inicializo os hosts de serviços que ele vai prover
                host = new ServiceHost(typeof(TerminalEntryManager), new Uri[] { });//inicializo
                host.Open();//abro o host
                m_services.Add(host);//adiciono na lista
    
            }
    
            /// <summary>
            /// Chamada de parada do serviço
            /// </summary>
            protected override void OnStop()
            {
                foreach (ServiceHost host in m_services)
                {
                    host.Close();
                }
            }
    Ao tentar inicializar o serviço com estas alterações da um erro, falando q O serviço xxx em computador local foi iniciado e interrompido bla bla bla.

    Alguem sabe o q pode estar faltando?

    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    quinta-feira, 15 de outubro de 2009 18:59

Respostas

  • Boas Leandro,

    Tem algumas coisas erradas nele. O que vincula o ServiceHost ao arquivo de configuração é o atributo "name" do elemento service. Tente assim:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <service name="TwoB.BusinessManager.BMSService.TerminalEntry.TerminalEntryManager">
            <host>
              <baseAddresses>
                <add baseAddress="net.tcp//localhost:8714"/>
              </baseAddresses>
            </host>
            <!--
            Criação dos ENDPOINTS.
            -->
            <!--Serviço de Entrada de Terminais-->
            <endpoint address="TwoB.BusinessManager.BMSService.TerminalEntry.TerminalEntryManager"
                      binding="netTcpBinding"
                      contract="TwoB.BusinessManager.Contract.Security.TerminalEntry.ITerminalEntryContract"/>
           
          </service>
        </services>
      </system.serviceModel>
    </configuration>
    http://www.israelaece.com
    quinta-feira, 15 de outubro de 2009 19:38
    Moderador
  • Boas Leandro,

    Faltou o ":" no endereço: net.tcp://localhost:8714
    http://www.israelaece.com
    quinta-feira, 15 de outubro de 2009 19:58
    Moderador

Todas as Respostas

  • Boas Leandro,

    Dá uma olhada no EventLog para ver a mensagem de erro.
    http://www.israelaece.com
    quinta-feira, 15 de outubro de 2009 19:05
    Moderador
  • Bem lembrado!

    Service cannot be started. System.Configuration.ConfigurationErrorsException: Required attribute 'name' not found. (D:\Documentos Pessoais\Leandro\Projetos\Projetos Pessoais\Framework 3.5\C#\2B\Business Manager\BM.Services\BMS Service\bin\Debug\TwoB.BusinessManager.SBMService.exe.Config line 5) at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult) at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLk...

    Required attribute NAME
    Alguma idéia nova?
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    quinta-feira, 15 de outubro de 2009 19:07
  • Boas Leandro,

    O que tem no seu arquivo de configuração?
    http://www.israelaece.com
    quinta-feira, 15 de outubro de 2009 19:09
    Moderador
  • Apenas a declaração do serviço!

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <service>
            <host>
              <baseAddresses>
                <add baseAddress="net.tcp//localhost:8714"/>
              </baseAddresses>
            </host>
            <!-- 
            Criação dos ENDPOINTS.
            -->
            <!--Serviço de Entrada de Terminais-->
            <endpoint address="TwoB.BusinessManager.BMSService.TerminalEntry.TerminalEntryManager"
                      binding="netTcpBinding"
                      contract="TwoB.BusinessManager.Contract.Security.TerminalEntry.ITerminalEntryContract"/>
            
          </service>
        </services>
      </system.serviceModel>
    </configuration>


    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    quinta-feira, 15 de outubro de 2009 19:13
  • Boas Leandro,

    Tem algumas coisas erradas nele. O que vincula o ServiceHost ao arquivo de configuração é o atributo "name" do elemento service. Tente assim:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <service name="TwoB.BusinessManager.BMSService.TerminalEntry.TerminalEntryManager">
            <host>
              <baseAddresses>
                <add baseAddress="net.tcp//localhost:8714"/>
              </baseAddresses>
            </host>
            <!--
            Criação dos ENDPOINTS.
            -->
            <!--Serviço de Entrada de Terminais-->
            <endpoint address="TwoB.BusinessManager.BMSService.TerminalEntry.TerminalEntryManager"
                      binding="netTcpBinding"
                      contract="TwoB.BusinessManager.Contract.Security.TerminalEntry.ITerminalEntryContract"/>
           
          </service>
        </services>
      </system.serviceModel>
    </configuration>
    http://www.israelaece.com
    quinta-feira, 15 de outubro de 2009 19:38
    Moderador
  • agora deu outro

    Service cannot be started. System.ArgumentException: Only an absolute Uri can be used as a base address.
       at System.ServiceModel.Description.ConfigLoader.LoadHostConfig(ServiceElement serviceElement, ServiceHostBase host, Action`1 addBaseAddress)
       at System.ServiceModel.Description.ConfigLoader.LoadServiceDescription(ServiceHostBase host, ServiceDescription description, ServiceElement serviceElement, Action`1 addBaseAddress)
       at System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader configLoader, ServiceDescription description, ServiceElement serviceSection)
       at System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader configLoader, ServiceDescription description, String configurationName)
       at System.ServiceModel.ServiceHostBase.ApplyConfiguration()
       at System.ServiceModel.ServiceHostBase.InitializeDescription(UriSchemeKeyedCollection baseAddresses)
       at System.ServiceModel.ServiceHost.InitializeDescription(Type serviceType, UriSchemeKeyedCollection baseAddresses...

    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    quinta-feira, 15 de outubro de 2009 19:54
  • Boas Leandro,

    Faltou o ":" no endereço: net.tcp://localhost:8714
    http://www.israelaece.com
    quinta-feira, 15 de outubro de 2009 19:58
    Moderador
  • Perfeito Israel. Algumas coisas não tinha entendido ainda.
    Meu próximo passo é fazer um projeto Client conseguir acessar isso tudo! Mas isso vou deixar para outro (se necessário) post!

    Muito obrigado até aqui!

    Abraços
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    quinta-feira, 15 de outubro de 2009 20:00