.net - El servicio tiene puntos finales de aplicación cero(sin infraestructura)
wcf exception-handling (15)
Recientemente creé un servicio WCF (dll) y un servidor de servicio (exe). Sé que mi servicio WCF funciona correctamente ya que puedo agregar el servicio a WcfTestClient.
Sin embargo, parece que me encuentro con un problema cuando utilizo mi WCF desde un host de servicio (exe). Puedo agregar una referencia a WCF (dll) a mi servidor 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, compilan y finalmente instalan el exe usando InstallUtil. Pero, cuando traté de iniciar el servicio en Microsoft Management Console, el servicio se detiene inmediatamente después de que se inició.
Así que comencé a investigar qué podría estar causando exactamente este problema y se me ocurrió este error desde el registro de la aplicación en el Visor de eventos.
Descripción:
El servicio no puede iniciarse. System.InvalidOperationException: Service ''Service'' tiene puntos finales de aplicación cero (sin infraestructura). Esto podría deberse a que no se encontró ningún archivo de configuración para su aplicación, o porque no se pudo encontrar ningún elemento de servicio que coincida con el nombre del servicio en el archivo de configuración, o porque no se definieron puntos finales en el elemento de servicio.
Este error se genera realmente en OnStart
; de mi exe, cuando realizo esta llamada ServiceHost.Open()
. He visto numerosos mensajes en los que otras personas se han encontrado con este problema; sin embargo, la mayoría, si no todos, afirman que el nombre o el contrato del servicio; nombre de espacio y nombre de clase, no se están especificando. Revisé ambas entradas en mi archivo de configuración; tanto en el exe como en el dll, y coinciden PERFECTAMENTE. He tenido a otras personas en la oficina revisando dos veces detrás de mí para asegurarse de que no estuviera ciego en un punto, pero por supuesto llegaron a la misma conclusión que yo, que todo parecía estar especificado correctamente. Estoy realmente perdido en lo que está sucediendo en este momento. ¿Alguien podría ayudarme con este problema?
Otra cosa que surgió como una posible razón de que esto esté sucediendo es que la aplicación.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? De nuevo, CUALQUIER ayuda sería apreciada.
Acabo de resolver este problema en mi servicio. Aquí está el error que estaba recibiendo:
El servicio ''EmailSender.Wcf.EmailService'' tiene puntos finales de aplicación cero (sin infraestructura). Esto podría deberse a que no se encontró ningún archivo de configuración para su aplicación, o porque no se pudo encontrar ningún elemento de servicio que coincida con el nombre del servicio en el archivo de configuración, o porque no se definieron puntos finales en el elemento de servicio.
Estos son los dos pasos que utilicé para solucionarlo:
Use el nombre de clase completo calificado:
<service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
Habilite un punto final con mexHttpBinding, y lo más importante, utilice el contrato IMetadataExchange:
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
Acabo de tener este problema y lo resolví agregando el espacio de nombres al nombre del servicio, por ej.
<service name="TechResponse">
convirtió
<service name="SvcClient.TechResponse">
También lo he visto resuelto con un Web.config en lugar de un App.config.
Acabo de toparme con este problema y verifiqué todas las respuestas anteriores para asegurarme de que no me faltaba nada obvio. Bueno, tuve un problema semi-obvio. Mi carcasa de mi nombre de clase en el código y el nombre de clase que utilicé en el archivo de configuración no coinciden.
Por ejemplo: si el nombre de la clase es CalculatorService y el archivo de configuración se refiere a Calculatorservice ... obtendrá este error.
Como otra pista, eso de hecho solucionó este problema en mi caso.
Estoy migrando algunos servicios de WCF desde una aplicación de consola (que configura en código pocos servicios WCF) a Azure WebRole 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 un rockstar 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 allí de nuevo.
Espero que te ahorre tiempo.
Ejecuté Visual Studio en modo Administrador y funcionó para mí :) Además, asegúrese de que el archivo app.config que está utilizando 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.
El punto final también debe tener el espacio de nombre:
<endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />
Este error ocurrirá si el archivo de configuración de la aplicación de alojamiento de su servicio WCF no tiene la configuración adecuada.
Recuerde este comentario de la configuración:
Al implementar el proyecto de la 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 servicio, pero leerá el archivo web.config del servidor una vez desplegado. Si web.config no tiene la configuración <system.serviceModel>
idéntica, recibirá este error. Asegúrese de copiar la configuración desde app.config una vez que se haya perfeccionado.
Mi problema fue cuando cambié el nombre de mi clase Service1 predeterminada para el archivo .svc a un nombre más significativo, lo que hizo que el comportamiento de web.configConfiguration y el punto final se correspondieran con la convención de nomenclatura anterior. Intenta arreglar tu web.config.
Preparar la configuración para WCF es difícil, y algunas veces una definición de tipo de servicio pasa desapercibida.
Escribí solo el espacio de nombres en la etiqueta de servicio, así que obtuve el mismo error.
<service name="ServiceNameSpace">
No olvide, 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.
Simplemente copie el archivo App.config del proyecto de servicio a la aplicación host de la consola y pegue aquí y luego elimínelo del proyecto de servicio.
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 hacer que el proceso principal de mi servicio de Windows también lo utilizara para realizar varias tareas en un temporizador / horario).
La solución fue que seleccioné correctamente mi archivo App.config y elegí Editar configuración 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 punto final fue para la conexión a la Biblioteca de Servicios WCF, y otro fue para el alojamiento de la misma.
Una cosa crucial para recordar para quienes 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 configuración system.serviceModel
está allí, entonces necesita mover esa sección de config a App.config de su proyecto de consola.
Esto se suma a las respuestas relativas a garantizar que el espacio de nombre se especifique en los lugares correctos.
Una cosa en que pensar es: ¿tiene su WCF completamente desacoplado del WindowsService (WS)? Un WS es doloroso porque no tienes mucho control o visibilidad para ellos. Trato de mitigar esto teniendo todas mis cosas que no son de WS en sus propias clases para que puedan ser probadas independientemente del host WS. El uso de este enfoque puede ayudarlo a eliminar cualquier cosa que esté sucediendo con el tiempo de ejecución de WS frente a su servicio en particular.
Es probable que John tenga razón en que se trata de un problema de archivo .config. WCF siempre buscará el contexto de ejecución .config . Entonces, si aloja su WCF en diferentes contextos de ejecución (es decir, prueba con una aplicación de consola y despliega con un WS), debe asegurarse de que los datos de configuración de WCF pasen al archivo .config apropiado. Pero el problema subyacente para mí es que no sabes cuál es el problema porque la sustancia pegajosa WS se interpone en el camino. Si aún no lo ha reorganizado para que pueda ejecutar su servicio en cualquier contexto (es decir, prueba de unidad o consola), sugiero que lo haga. Si activa su servicio en una prueba unitaria, es probable que falle 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 asquerosa.
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 hacerlo funcionar fue agregar una llamada al miembro AddServiceEndpoint
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 haber sido agregado en el archivo .config.
AddServiceEndpoint
una excepción más detallada cuando lo 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();