El servicio no tiene terminales de aplicación (que no sean de infraestructura)

91

Recientemente creé un servicio WCF (dll) y un host de servicio (exe). Sé que mi servicio WCF funciona correctamente ya que puedo agregar con éxito el servicio a WcfTestClient.

Sin embargo, parece que me estoy encontrando con un problema cuando llego a utilizar mi WCF desde un host de servicio (exe). Puedo agregar una referencia a WCF (dll) a mi host de servicio (exe) y crear los componentes necesarios para el exe; como el instalador del servicio, el host del servicio y la aplicación.config, compile y finalmente instale el archivo ejecutable utilizando InstallUtil. Pero, cuando intenté iniciar el servicio en Microsoft Management Console, el servicio se detiene inmediatamente después de iniciarse.

Entonces comencé a investigar qué podría estar causando exactamente este problema y se me ocurrió este error en el Registro de la aplicación en el Visor de eventos.

Descripción:

No se puede iniciar el servicio. System.InvalidOperationException: el servicio 'Service' no tiene puntos finales de aplicación (no de infraestructura). Esto puede deberse a que no se encontró ningún archivo de configuración para su aplicación, a que no se pudo encontrar ningún elemento de servicio que coincida con el nombre del servicio en el archivo de configuración, o a que no se definieron puntos finales en el elemento de servicio.

Este error se genera realmente en el OnStart; de mi exe, cuando realizo esta llamada ServiceHost.Open(). He visto numerosas publicaciones en las que otras personas se han encontrado con este problema; sin embargo, la mayoría, si no todas, afirman que el nombre del servicio o el contrato; el espacio de nombres y el nombre de la clase no se especifican. Verifiqué ambas entradas en mi archivo de configuración; tanto en el exe como en el dll, y coinciden PERFECTAMENTE. Otras personas en la oficina me revisaron dos veces para asegurarme de que no me quedara ciego en un momento dado, pero por supuesto llegaron a la misma conclusión que yo de que todo parecía estar especificado correctamente. Realmente estoy perdido en cuanto a lo que está sucediendo en este momento. ¿Alguien podría ayudarme con este problema?

Otra cosa que surgió como una posible razón por la que esto puede estar sucediendo es que app.config nunca se lee; al menos no el que creo que debería ser leído. ¿Podría ser éste el problema? Si es así, ¿cómo puedo abordar este problema? Una vez más, se agradecería CUALQUIER ayuda.

user280626
fuente
2
La definición del contrato de servicio debe copiarse de service.dll.config a service.exe.config.
John Saunders
1
¿Puede mostrarnos la aplicación.config del servicio? ¿Haces algo especial en el servicio NT para crear una instancia / abrir ServiceHost?
marc_s

Respuestas:

93

Acabo de tener este problema y lo resolví agregando el espacio de nombres al nombre del servicio, por ejemplo

 <service name="TechResponse">

convirtió

 <service name="SvcClient.TechResponse">

También lo he visto resuelto con un Web.config en lugar de un App.config.

SteveCav
fuente
Sí, cambiamos los espacios de nombres para que no pudiera encontrar el servicio que coincidiera con el del archivo .svc (¡se cambió un guión bajo con un punto!). Una verificación rápida de los nombres de los servicios reveló lo que estaba pasando.
1
También resolvió mi problema, ¡me encantan estas soluciones rápidas y fáciles!
vfilby
Agregar un web.config me ayudó a resolver este error.
Ryan Rodemoyer
2
Esto resolvió mi problema !!! ¡Muchas gracias! Para todos los novatos como yo: sugiera este tutorial muy claro: lourenco.co.za/blog/2013/08/…
Homer1982
12

El punto final también debe tener el espacio de nombres:

 <endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />
Asif Khan
fuente
Tengo esto en app.config pero quiero cambiarlo en el código sin eliminarlo de app.config. El uso de New ServiceHost con una nueva dirección de punto final da un error.
Paul McCarthy
9

Una cosa en la que pensar es: ¿Tiene su WCF completamente desacoplado del WindowsService (WS)? Un WS es doloroso porque no tienes mucho control o visibilidad sobre ellos. Intento mitigar esto teniendo todas mis cosas que no son de WS en sus propias clases para que puedan probarse independientemente del servidor de WS. El uso de este enfoque podría ayudarlo a eliminar cualquier cosa que esté sucediendo con el tiempo de ejecución de WS en comparación con su servicio en particular.

John probablemente tenga razón en que se trata de un problema de archivo .config. WCF siempre buscará el contexto de ejecución .config . Por lo tanto, si aloja su WCF en diferentes contextos de ejecución (es decir, prueba con una aplicación de consola e implementa con un WS), debe asegurarse de que los datos de configuración de WCF se hayan movido al archivo .config adecuado. Pero el problema subyacente para mí es que no sabes cuál es el problema porque la sustancia WS se interpone en el camino. Si aún no lo ha refactorizado para que pueda ejecutar su servicio en cualquier contexto (es decir, prueba de unidad o consola), le sugiero que lo haga. Si hace girar su servicio en una prueba unitaria, probablemente fallará de la misma manera que está viendo con el WS, que es mucho más fácil de depurar en lugar de intentar hacerlo con la tubería de WS.

Kevin ganó
fuente
1
Gracias por responder tan rápido. Copié mi app.config de mi WCF (dll), así que no creo que ese sea el problema. Pero me parece extraño que pueda activar mi WCF (dll) usando WcfTestclient.exe sin ningún problema. Me parece que si algo era una neblina con el archivo de configuración, debería haber fallado allí también, no solo cuando intento ejecutarlo en un Windows Service Host (exe). Pido disculpas si sueno un "poco" perdido, todavía soy un novato en WCF y el período de servicios desafortunadamente. ¿Cualquier otra sugerencia?
user280626
9

Simplemente copie el archivo App.config del proyecto de servicio a la aplicación de host de la consola y péguelo aquí y luego elimínelo del proyecto de servicio.

usufhamad
fuente
5

Obtuve una excepción más detallada cuando la agregué programáticamente 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
fuente
1
¡Gracias! pasar la dirección de esta manera me mostró más detalles de la excepción. En mi caso fue simplemente que el puerto fue utilizado por otro proceso :)
Hernan Veiras
Tengo el mismo problema, ¿la dirección base es la misma que la dirección cuando hace clic en descubrir en la referencia de agregar servicio?
ZoomVirus
4

Preparar la configuración para WCF es difícil y, a veces, la definición de un tipo de servicio pasa desapercibida.

Escribí solo el espacio de nombres en la etiqueta de servicio, por lo que obtuve el mismo error.

<service name="ServiceNameSpace">

No olvide que la etiqueta de servicio necesita un nombre de clase de servicio totalmente calificado.

<service name="ServiceNameSpace.ServiceClass">

Para las otras personas que son como yo.

Uğur Aldanmaz
fuente
1
¿Quieres decir como respondí aquí cuatro años antes?
SteveCav
Se ven iguales pero hay una diferencia. Su muestra incorrecta es sobre escribir solo el nombre de la clase ( TechResponse) pero la mía está escribiendo solo el espacio de nombres ( ServiceNameSpace).
Uğur Aldanmaz
4

Hoy me encontré con el mismo problema, publicando aquí mi error y la corrección para que pueda ayudar a alguien.

Mientras reestructuraba el código, en realidad había cambiado la clase de servicio y los nombres de IService y había cambiado ServiceHost para que apunte a este nuevo nombre de clase de servicio (como se muestra en el fragmento de código), pero en mi archivo App.Config de aplicaciones de host todavía estaba usando el nombre de clase de servicio antiguo . (consulte el campo de nombre de la sección de configuración en el siguiente fragmento)

Aquí está el fragmento de código,

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

y en el archivo App.config en la sección de servicios, me refería al antiguo nombre de la clase de servicio , cambiándolo a New ServiceClassName solucionado el problema para mí.

  <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>
ceniza
fuente
Igual que aquí. Cambié las mayúsculas de mi clase y el nombre del contrato y todo funcionó. Gracias.
Chazaq
3

Yo tuve el mismo problema. Todo funciona en VS2010 pero cuando ejecuto el mismo proyecto en VS2008 obtengo la excepción mencionada.

Lo que hice en mi proyecto VS2008 para que funcionara fue agregar una llamada al AddServiceEndpointmiembro de mi objeto ServiceHost.

Aquí está mi fragmento 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();

No modifiqué el archivo app.config. Pero supongo que el punto final del servicio también podría haberse agregado en el archivo .config.

Bo Christian Skjøtt
fuente
Cuando uso este método, obtengo AddressAccessDeniedException aunque puedo usar esta dirección para la dirección addServiceReferance.
ZoomVirus
2

Acabo de resolver este problema en mi servicio. Aquí está el error que estaba recibiendo:

El servicio 'EmailSender.Wcf.EmailService' no tiene puntos finales de aplicación (sin infraestructura). Esto puede deberse a que no se encontró ningún archivo de configuración para su aplicación, a que no se pudo encontrar ningún elemento de servicio que coincida con el nombre del servicio en el archivo de configuración o a que no se definieron puntos finales en el elemento de servicio.

Estos son los dos pasos que utilicé para solucionarlo:

  1. Utilice el nombre de clase completo y correcto:

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
  2. Habilite un punto final con mexHttpBinding y, lo más importante, use el contrato IMetadataExchange:

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
Letgetsilly
fuente
2

Este error ocurrirá si el archivo de configuración de la aplicación de hospedaje de su servicio WCF no tiene la configuración adecuada.

Recuerda este comentario de la configuración:

Al implementar el proyecto de biblioteca de servicios, el contenido del archivo de configuración debe agregarse al archivo app.config del host. System.Configuration no admite archivos de configuración para bibliotecas.

Si tiene un servicio WCF alojado en IIS, durante el tiempo de ejecución a través de VS.NET leerá el archivo app.config del proyecto de la biblioteca de servicios, pero leerá el archivo web.config del host una vez implementado. Si web.config no tiene la misma <system.serviceModel>configuración, recibirá este error. Asegúrese de copiar la configuración de app.config una vez que se haya perfeccionado.

atconway
fuente
2

Me encontré con este problema y verifiqué todas las respuestas anteriores para asegurarme de que no me estaba perdiendo nada obvio. Bueno, tuve un problema semi-obvio. Mi nombre de clase en el código y el nombre de clase que usé en el archivo de configuración no coincidían.

Por ejemplo: si el nombre de la clase es CalculatorService y el archivo de configuración se refiere a Calculatorservice ... obtendrá este error.

desperdiciado30minOnThis
fuente
Acabo de experimentar lo mismo. Puede ser difícil de encontrar, especialmente al refactorizar bases de código grandes. Recuerde actualizar los espacios de nombres en la configuración de WCF cuando mueva las cosas.
Arve Systad
2

Ejecuté Visual Studio en modo Administrador y funcionó para mí :) Además, asegúrese de que el archivo app.config que está usando para escribir la configuración WCF debe estar en el proyecto donde se usa la clase "ServiceHost", y no en el servicio WCF real proyecto.

DfrDkn
fuente
Esto me ha ahorrado mucho tiempo. :)
Parag
1

Mi problema fue cuando cambié el nombre de mi clase Service1 predeterminada para el archivo .svc a un nombre más significativo, lo que provocó que la configuración de comportamiento y el punto final de web.config se correspondieran con la convención de nomenclatura anterior. Intente arreglar su web.config.

Miguel
fuente
1

Una cosa crucial para recordar para aquellos que trabajan con una aplicación de consola para alojar el servicio WCF es que el archivo Web.config en el proyecto WCF se ignora por completo. Si su system.serviceModelconfiguración está ahí, entonces necesita mover esa sección de config al App.config de su proyecto de consola.

Esto se suma a las respuestas relativas a garantizar que el espacio de nombres se especifique en los lugares correctos.

Neo
fuente
1

Como otra pista, eso de hecho solucionó este problema en mi caso.

Estoy migrando algunos servicios WCF desde una aplicación de consola (que configura en código algunos servicios WCF) a un WebRole de Azure para publicarlos en Azure. Cada vez que agrego un nuevo servicio, VS edita mi web.config y agrega esta línea:

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

Bueno, con todos los consejos y respuestas anteriores, no pude hacerlo funcionar hasta que eliminé todos los atributos en el elemento serviceHostingEnvironment. Como puede ver, no soy una estrella de rock de WCF, pero lo hice para trabajar con el primer servicio simplemente configurándolo como:

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

            </service>

pero cuando agregué el segundo Servicio dejó de funcionar y me di cuenta de que esos atributos estaban ahí nuevamente.

Espero que te ahorre tiempo.

Juan
fuente
0

Tuve este error en un servicio de Windows cuando mi biblioteca de servicios WCF que creé no estaba conectada para el alojamiento, pero estaba conectada para la conexión. Me faltaba un punto final. (Quería tanto la conexión como el alojamiento en mi servicio de Windows para poder servir el servicio WCF a otras conexiones, así como que el proceso principal de mi servicio de Windows lo usara también para realizar varias tareas en un temporizador / programa).

La solución fue que hice clic con el botón derecho en mi archivo App.config y elegí Editar configuración de WCF. Luego, hice los pasos para Crear servicio para poder conectarme a mi Servicio WCF. Ahora tenía dos puntos finales en mi App.config, no solo uno. Un extremo era para la conexión a la biblioteca de servicios WCF y otro era para hospedarlo.

Volomike
fuente