2011-05-20 20 views
13

Tengo un servicio WCF alojado dentro de un servicio de Windows. El servicio de Windows tiene un método OnStart así:Problema con el servicio WCF de alojamiento en un servicio de Windows

protected override void OnStart(string[] args) 
{ 
    serviceHost = new ServiceHost(typeof (RouterService)); 
    serviceHost.Open(); 
} 

Es bastante escaso ahora, ya que estoy tratando de encontrar el problema. Como no he procesado ningún error aquí, cualquier excepción en este punto debería haber detenido el inicio correcto del servicio. Comenzaría y luego se detendría automáticamente de nuevo.

Mi archivo de configuración para el servicio WCF tiene el siguiente aspecto:

<?xml version="1.0"?> 
<configuration> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
    <system.serviceModel> 
    <services> 
     <service name="WcfService.RouterService" 
       behaviorConfiguration="serviceBehavior" > 
     <endpoint address="RouterService" contract="WcfService.IRouterService" binding="wsHttpBinding" bindingConfiguration="NoSecurity" /> 
     <endpoint address="mex" contract="IMetadataExchange" binding="mexHttpBinding" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8000"/> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="NoSecurity"> 
      <security mode="None" /> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="serviceBehavior" > 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

Además, he añadido el usuario de servicio de red (que se ejecuta el servicio como para ser capaz de escuchar a HTTP en el puerto especificado :..

netsh http add urlacl url=http://+:8000/ user="NETWORK SERVICE" 

Ahora, en el cliente, elijo Add Service Reference puedo encontrar el servidor, y VS también se las arreglo para crear la configuración y hacer que los archivos proxy a continuación, en el interior del cliente, hago una instancia de la representación , y ábrelo. Todo sigue bien. Pero sobre c alling el primer método en proxy, obtengo la siguiente excepción:

El servicio HTTP ubicado en http://localhost:8000/RouterService está demasiado ocupado.

Sé que mi cliente es el único que está intentando conectarse a este servicio, entonces ¿por qué aparece este mensaje de error? ¿Y cómo puedo solucionar esto? No se apaga cuando intenta llamar al método, arroja la excepción casi de inmediato.

EDITAR

Ok, ahora descubrí que mi TestServer (no el cliente de Windows, pero una aplicación de consola) también se da el mismo error. Hoy no fue así, y ni el servicio WCF ni el TestServer han cambiado.

Luego intenté cambiar el puerto a 8080 en lugar de 8000, y funcionó. Luego intenté lo mismo con el servicio de Windows, y eso también funcionó (después de ejecutar el comando netsh http en el nuevo puerto)

Así que algo le ha sucedido a http en el puerto 8000 por algún motivo. He intentado reiniciar el sistema también, por supuesto.

Esto me deja perplejo, así que si alguien tiene alguna idea de lo que está pasando aquí, lo agradecería.

+0

¿Qué tipo devuelve su servicio? He visto este problema en servicios que devuelven tipos no personalizables. También podría ser un problema con el grupo de aplicaciones para el host de servicio que no se inicia o algo así. – Henric

+1

Acepto con @daft que el servicio puede no devolver un tipo de datos debido a problemas de serialización. El grupo de aplicaciones, si corresponde, no debería ser una preocupación, ya que es el mismo grupo (al menos en IIS) que sirve el wsdl/config que le permite generar la clase proxy (que ha realizado correctamente). – Smudge202

+0

+1 para aclarar el problema del grupo de aplicaciones. Gracias mancha. – Henric

Respuesta

13

Ok, después de un largo tiempo de intentar descubrir qué pasó aquí, encontré la solución.

Después de haber creado el servicio de Windows, y traté de iniciarlo, no pude, porque tuve que registrar primero al usuario de NETWORK SERVICE para escuchar en http post 8000. Por lo tanto, me encontré con este comando:

netsh http add urlacl url = http: // +: 8000/RouterService user = "Servicio de red"

Se dio un resultado exitoso, pero luego traté de iniciar el servicio, y recibió el mismo mensaje de error.Entonces me encontré con el mismo comando sin RouterService especificada:

netsh http add urlacl url = http: // +: 8000/user = "Servicio de red"

Se dio un resultado exitoso, y ahora mis ventanas el servicio comenzó sin ningún problema, pero obtuve los problemas mencionados en la pregunta anterior.

Parece que la primera llamada a netsh causa todos estos problemas. Traté de sacarlo de nuevo con este comando:

netsh http eliminar url = urlacl http: // +: 8000/RouterService

Y luego todo funcionó a la perfección.

Una perra para depurar esto ya que la excepción no tenía nada que ver con el problema real, así que espero que esta pregunta puede salvar a otra persona un par de horas :)

4

siguiente respuesta de @ Oyvind-Knobloch-Brathen considerar para utilizar cadenas de SID bien conocidas en lugar de la clave de línea de comando de "usuario", esto le dará portabilidad cruzada (he experimentado problemas en la máquina Win7 localizada en francés). Para obtener más información, consulte SID strings. Para su caso, esto será:

netsh http add url = urlacl http: // +: 8000/sddl = "O: NS"

a link to SDDL on MSDN.

Cuestiones relacionadas