O serviço não tem nenhum ponto de extremidade de aplicativo (não infraestrutura)

91

Recentemente, criei um serviço WCF (dll) e um host de serviço (exe). Sei que meu serviço WCF está funcionando corretamente, pois consigo adicionar o serviço ao WcfTestClient com êxito.

No entanto, pareço estar tendo um problema ao usar meu WCF de um host de serviço (exe). Posso adicionar uma referência ao WCF (dll) ao meu host de serviço (exe) e criar os componentes necessários para o exe; como o instalador do serviço, o host do serviço e o app.config, compile e, por fim, instale o exe usando o InstallUtil. Mas, quando tentei iniciar o serviço no Console de Gerenciamento Microsoft, o serviço parou imediatamente após ser iniciado.

Então, comecei a investigar o que exatamente poderia estar causando esse problema e encontrei esse erro no Log do aplicativo no Visualizador de eventos.

Descrição:

O serviço não pode ser iniciado. System.InvalidOperationException: Service 'Service' tem nenhum ponto de extremidade de aplicativo (não infra-estrutura). Isso pode ser porque nenhum arquivo de configuração foi localizado para seu aplicativo, ou porque nenhum elemento de serviço correspondente ao nome do serviço pôde ser localizado no arquivo de configuração, ou porque nenhum terminal foi definido no elemento de serviço.

Na verdade, esse erro é gerado no OnStart; do meu exe, quando faço esta chamada ServiceHost.Open(). Já vi várias postagens em que outras pessoas se depararam com esse problema, porém a maioria, senão todos, afirmam que o nome do serviço ou contrato; namespace e nome de classe, não estão sendo especificados. Eu verifiquei essas duas entradas em meu arquivo de configuração; tanto no exe quanto no dll, e eles combinam PERFEITAMENTE. Pedi a outras pessoas no escritório que verificassem atrás de mim para ter certeza de que eu não estava ficando cego em algum momento, mas é claro que eles chegaram à mesma conclusão que eu de que tudo parecia estar especificado corretamente. Estou realmente perdido quanto ao que está acontecendo neste ponto. Alguém poderia me ajudar com esse problema?

Outra coisa que surgiu como uma possível razão para isso estar acontecendo é que o app.config nunca está sendo lido; pelo menos não aquele que eu acho que deveria ser lido. Seria este o problema? Em caso afirmativo, como posso resolver esse problema. Novamente, qualquer ajuda seria apreciada.

user280626
fonte
2
A definição do contrato de serviço deve ser copiada do service.dll.config para o service.exe.config.
John Saunders
1
você pode nos mostrar o app.config do serviço ?? Você faz algo especial no serviço NT para instanciar / abrir o ServiceHost?
marc_s

Respostas:

93

Acabei de ter esse problema e resolvi-o adicionando o namespace ao nome do serviço, por exemplo

 <service name="TechResponse">

passou a ser

 <service name="SvcClient.TechResponse">

Eu também vi isso resolvido com um Web.config em vez de um App.config.

SteveCav
fonte
Sim, mudamos os namespaces para que não conseguisse encontrar o serviço que correspondesse ao do arquivo .svc (um sublinhado foi trocado por um ponto!) Uma verificação rápida dos nomes de serviço revelou o que estava acontecendo.
1
Resolvi meu problema também, adoro essas soluções rápidas e fáceis!
vfilby
Adicionar um web.config ajudou a resolver esse erro para mim.
Ryan Rodemoyer
2
Isso resolveu meu problema !!! Muito obrigado! Para todos os novatos como eu: sugira este tutorial bem claro: lourenco.co.za/blog/2013/08/…
Homer1982
12

O endpoint também deve ter o namespace:

 <endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />
Asif Khan
fonte
Eu tenho isso no app.config, mas quero alterá-lo no código sem removê-lo do app.config. Usar o novo ServiceHost com um novo endereço de endpoint dá um erro.
Paul McCarthy
9

Uma coisa a se pensar é: você tem seu WCF completamente desacoplado do WindowsService (WS)? Um WS é doloroso porque você não tem muito controle ou visibilidade para eles. Tento mitigar isso tendo todas as minhas coisas não WS em suas próprias classes para que possam ser testadas independentemente do WS host. Usar essa abordagem pode ajudá-lo a eliminar qualquer coisa que esteja acontecendo com o tempo de execução do WS em comparação com seu serviço em particular.

John provavelmente está correto ao dizer que é um problema de arquivo .config. O WCF sempre procurará o contexto de execução .config . Portanto, se você estiver hospedando seu WCF em contextos de execução diferentes (ou seja, teste com um aplicativo de console e implante com um WS), você precisa ter certeza de que os dados de configuração do WCF foram movidos para o arquivo .config adequado. Mas a questão subjacente para mim é que você não sabe qual é o problema porque a gosma WS atrapalha. Se você ainda não refatorou para que possa executar seu serviço em qualquer contexto (ou seja, teste de unidade ou console), então eu sugiro fazer isso. Se você acelerou seu serviço em um teste de unidade, provavelmente falharia da mesma maneira que você está vendo com o WS, que é muito mais fácil de depurar do que tentar fazer com o encanamento WS nojento.

Kevin Won
fonte
1
Obrigado por responder tão rapidamente. Eu copiei meu app.config do meu WCF (dll), então não acho que esse seja o problema. Mas eu acho estranho que eu seja capaz de ativar meu WCF (dll) usando o WcfTestclient.exe sem problemas. Parece-me que se algo estava confuso com o arquivo de configuração, deveria ter falhado lá também, não apenas quando tento executá-lo em um Windows Service Host (exe). Peço desculpas se pareço um "pouco" perdido, ainda sou um novato no WCF e no período de serviços, infelizmente. Alguma outra sugestão?
user280626
9

Basta copiar o arquivo App.config do projeto de serviço para o aplicativo host do console, colar aqui e excluí-lo do projeto de serviço.

usufhamad
fonte
5

Recebi uma exceção mais detalhada quando adicionei programaticamente - AddServiceEndpoint:

string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));  

host.AddServiceEndpoint(typeof(MyNamespace.IService),
                        new BasicHttpBinding(), baseAddress);
host.Open();
LCJ
fonte
1
Obrigado! passar o endereço dessa forma me mostrou mais detalhes da exceção. No meu caso foi simplesmente que o porto foi utilizado por outro processo :)
Hernan Veiras 21/07/2014
Eu tenho o mesmo problema se o endereço base é o mesmo que o endereço quando você clica em descobrir na adição de referência de serviço?
ZoomVirus
4

Preparar a configuração para o WCF é difícil e, às vezes, uma definição de tipo de serviço passa despercebida.

Escrevi apenas o namespace na etiqueta de serviço, então recebi o mesmo erro.

<service name="ServiceNameSpace">

Não se esqueça, a etiqueta de serviço precisa de um nome de classe de serviço totalmente qualificado.

<service name="ServiceNameSpace.ServiceClass">

Para as outras pessoas que são como eu.

Uğur Aldanmaz
fonte
1
Você quer dizer como eu respondi aqui quatro anos antes?
SteveCav
Eles parecem iguais, mas há uma diferença. Seu exemplo errado é sobre escrever apenas o nome da classe ( TechResponse), mas o meu é escrever apenas o namespace ( ServiceNameSpace).
Uğur Aldanmaz
4

Hoje me deparei com o mesmo problema, postando aqui meu erro e correção dele para que possa ajudar alguém.

Durante a reestruturação do código, eu realmente mudei os nomes da classe Service e IService e mudei ServiceHost para apontar para este novo nome de classe Service (conforme mostrado no trecho de código), mas em meus aplicativos de host App.Config arquivo eu ainda estava usando o antigo nome de classe Service . (consulte o campo do nome da seção de configuração no snippet abaixo)

Aqui está o snippet de código,

 ServiceHost myServiceHost = new ServiceHost(typeof(NewServiceClassName)); 

e no arquivo App.config na seção services eu estava me referindo ao nome da classe de serviço antiga, alterando-o para New ServiceClassName corrigiu o problema para mim.

  <service name="ProjectName.OldServiceClassName"> 
        <endpoint address="" binding="basicHttpBinding" contract="ProjectName.IService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress=""/>
          </baseAddresses>
        </host>
      </service>
cinza
fonte
O mesmo aqui. Mudei a capitalização da minha classe e nome do contrato e tudo funcionou. Obrigado.
Chazaq
3

Eu tive o mesmo problema. Tudo funciona no VS2010, mas quando executo o mesmo projeto no VS2008 recebo a exceção mencionada.

O que fiz em meu projeto VS2008 para fazê-lo funcionar foi adicionar uma chamada ao AddServiceEndpointmembro do meu objeto ServiceHost.

Aqui está meu snippet de código:

Uri baseAddress = new Uri("http://localhost:8195/v2/SystemCallbackListener");

ServiceHost host = new ServiceHost(typeof(SystemCallbackListenerImpl), baseAddress);

host.AddServiceEndpoint(typeof(CsfServiceReference.SystemCallbackListener),
                        new BasicHttpBinding(),
                        baseAddress);
host.Open();

Eu não modifiquei o arquivo app.config. Mas acho que o ponto de extremidade do serviço também poderia ter sido adicionado ao arquivo .config.

Bo Christian Skjøtt
fonte
Quando uso este método, obtenho AddressAccessDeniedException, embora possa usar este endereço para o endereço addServiceReferance.
ZoomVirus
2

Acabei de resolver esse problema no meu serviço. Aqui está o erro que estava recebendo:

O serviço 'EmailSender.Wcf.EmailService' tem nenhum ponto de extremidade de aplicativo (sem infraestrutura). Isso pode ser porque nenhum arquivo de configuração foi localizado para seu aplicativo, ou porque nenhum elemento de serviço correspondente ao nome do serviço pôde ser localizado no arquivo de configuração, ou porque nenhum terminal foi definido no elemento de serviço.

Aqui estão as duas etapas que usei para corrigir isso:

  1. Use o nome de classe totalmente qualificado correto:

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
  2. Habilite um endpoint com mexHttpBinding e, o mais importante, use o contrato IMetadataExchange:

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
deixa-nos bem
fonte
2

Esse erro ocorrerá se o arquivo de configuração do aplicativo de hospedagem de seu serviço WCF não tiver a configuração adequada.

Lembre-se deste comentário da configuração:

Ao implementar o projeto de biblioteca de serviço, o conteúdo do arquivo de configuração deve ser adicionado ao arquivo app.config do host. System.Configuration não oferece suporte a arquivos de configuração para bibliotecas.

Se você tiver um serviço WCF hospedado no IIS, durante o tempo de execução via VS.NET, ele lerá o app.config do projeto de biblioteca de serviço, mas lerá o web.config do host uma vez implantado. Se o web.config não tiver a <system.serviceModel>configuração idêntica, você receberá este erro. Certifique-se de copiar a configuração do app.config assim que for aperfeiçoada.

atconway
fonte
2

Acabei de encontrar esse problema e verifiquei todas as respostas acima para ter certeza de que não estava perdendo nada óbvio. Bem, eu tive um problema semi-óbvio. Minha capitalização de meu nome de classe no código e o nome de classe que usei no arquivo de configuração não correspondem.

Por exemplo: se o nome da classe for CalculatorService e o arquivo de configuração se referir a Calculatorservice ... você obterá este erro.

desperdiçou30minOnThis
fonte
Acabei de experimentar a mesma coisa. Pode ser difícil de encontrar, especialmente ao refatorar grandes bases de código. Lembre-se de atualizar os namespaces na configuração do WCF ao mover as coisas.
Arve Systad
2

Executei o Visual Studio no modo Administrador e funcionou para mim :) Além disso, certifique-se de que o arquivo app.config que você está usando para escrever a configuração do WCF deve estar no projeto em que a classe "ServiceHost" é usada, e não no serviço WCF real projeto.

DfrDkn
fonte
Isso me economizou muito tempo. :)
Parag
1

Meu problema foi quando renomei minha classe Service1 padrão para o arquivo .svc com um nome mais significativo, o que fazia com que web.config behaviorConfiguration e endpoint correspondessem à antiga convenção de nomenclatura. Tente corrigir seu web.config.

Michael
fonte
1

Algo crucial a ser lembrado para aqueles que trabalham com um aplicativo de console para hospedar o serviço WCF é que o arquivo Web.config no projeto WCF é completamente ignorado. Se sua system.serviceModelconfiguração estiver lá, você precisará mover essa seção de configuração para App.config de seu projeto de console.

Isso é um acréscimo às respostas sobre como garantir que o namespace seja especificado nos lugares corretos.

Neo
fonte
1

Como outra pista, isso de fato resolveu esse problema no meu caso.

Estou migrando alguns serviços WCF de um aplicativo de console (que configura em código alguns serviços WCF) para um Azure WebRole para publicá-los no Azure. Cada vez que adiciono um novo serviço, o VS edita meu web.config e adiciona esta linha:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">

Bem, com todos os conselhos e respostas acima, não consegui fazer funcionar até que removesse todos os atributos no elemento serviceHostingEnvironment. Como você pode ver, não sou um rockstar WCF, mas fiz para funcionar com o primeiro serviço configurando-o como:

<service name="FirstService" behaviorConfiguration="metadataBehavior">
                <endpoint address=""
                 binding="wsHttpBinding"
                 bindingConfiguration="WSHttpBinding_WcfServicesBinding"
                 contract="IFirstService" />

            </service>

mas quando adicionei o segundo serviço ele parou de funcionar e percebi que aqueles atributos estavam lá novamente.

Espero que você economize tempo.

Juan
fonte
0

Eu tive este erro em um serviço do Windows quando minha biblioteca de serviços WCF que criei não estava conectada para hospedagem, mas estava conectada para conexão. Eu estava perdendo um ponto final. (Eu queria tanto a conexão quanto a hospedagem em meu serviço do Windows para poder servir o serviço WCF a outras conexões, bem como fazer com que o processo principal do meu serviço do Windows o usasse para realizar várias tarefas em um cronômetro / programação.)

A correção foi que eu cliquei com o botão direito em meu arquivo App.config e escolhi Editar configuração do WCF. Em seguida, executei as etapas de Criar serviço para que pudesse me conectar ao meu serviço WCF. Agora eu tinha dois pontos de extremidade em meu App.config, não apenas um. Um ponto de extremidade era para a conexão com a Biblioteca de Serviços WCF e outro para a hospedagem dela.

Volomike
fonte