2009-03-25 6 views
4

J'ai un serveur WCF que je peux exécuter en tant que service ou en tant qu'application de formulaires Windows. Lorsque je l'exécute en tant qu'application Windows Forms, je peux me connecter via mon application client. Cependant quand je l'exécute en tant que service en utilisant le même code, je ne peux pas me connecter à lui. J'ai confirmé que le service fonctionne et fait son travail. Voici le fichier de configuration du serveur.WCF fonctionne en tant qu'application, mais pas en tant que service

<system.serviceModel> 
    <services> 
    <service name="Cns.TrafficCopService.ManagementService"> 
     <host> 
     <baseAddresses> 
      <add baseAddress="http://localhost:8000/TrafficCop/ManagementService" /> 
     </baseAddresses> 
     </host> 
     <endpoint address="" binding="wsHttpBinding" contract="Cns.TrafficCopService.IManagementService" /> 
    </service> 
    </services> 
</system.serviceModel> 

et son code d'hébergement, appelé 100 millisecondes après OnStart est appelé:

if (this.serviceHost != null) 
{ 
    this.serviceHost.Close(); 
} 

this.serviceHost = new ServiceHost(typeof(ManagementService)); 
this.serviceHost.Open(); 

et le fichier de configuration du client:

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="WSHttpBinding_IManagementService" /> 
    </wsHttpBinding> 
    </bindings> 
    <client> 
    <endpoint 
     address="http://localhost:8000/TrafficCop/ManagementService" 
     binding="wsHttpBinding" 
     bindingConfiguration="WSHttpBinding_IManagementService" 
     contract="IManagementService" 
     name="WSHttpBinding_IManagementService"> 
    </endpoint> 
    </client> 
</system.serviceModel> 
+0

Où exécutez-vous le code d'hébergement? – Grzenio

+0

Le client et le serveur sont-ils sur le même ordinateur? Je me demande si "localhost" ne fait pas partie du problème ... un client distant ne demandera pas "localhost" ... –

+1

Ils sont sur la même machine. Encore une fois cela fonctionne comme une application, mais pas comme un service. –

Répondre

2

Pourriez-vous poster la suite de votre code pour hébergé le service?

Votre classe qui démarre le service doit hériter de "ServiceBase" et doit implémenter les méthodes "OnStart" et "OnStop". Ces méthodes sont appelées par la console de service pour démarrer et arrêter le processus de service. Votre ServiceHost doit donc être ouvert/fermé dans ces méthodes. Je me demandais si vous ne le faisiez peut-être pas.

+0

Je le fais en fait –

+0

La classe de temporisation que j'utilisais (System.Threading.Timer et System.Forms.Timer ne fonctionnait pas correctement dans le service.) Je les ai remplacés par System.Timers.Timer qui fonctionne correctement –

0

Où avez-vous le code qui crée le service hôte de? Ma première supposition serait que lorsque vous l'exécutez en tant que service, vous ne créez pas le ServiceHost, ou vous ne gardez pas la référence (donc il est récupéré)

+0

Le champ qui contient le service est sur le service lui-même et il ne devrait pas être collecté –

1

De quel compte est le service? comme? Je me demande si le service ne démarre pas, probablement parce qu'il n'a pas les permissions pour ouvrir le port. Essayez d'exécuter le service dans votre propre identité (mais en tant que service). Si cela fonctionne, c'est un problème d'autorisations. Le plus probable est les autorisations HTTP.SYS.

Pour attribuer un accès, utilisez netsh sur vista/window 7 ou httpcfg sur xp.

+0

Aussi - si ce n'est pas sur la même machine, vous devrez peut-être changer l'adresse pour être le nom réel utilisé par le client, plutôt que par "localhost" –

+0

Je courais comme moi (un administrateur local avec les droits Run as a Service) –

+0

Eh bien, ça valait le coup ... –

0

Si vous êtes sur la même machine, je suggère d'utiliser le NetNamedPipeBinding au lieu de WSHttpBinding. C'est plus rapide. Vous pouvez toujours revenir au ws-http si vous avez besoin d'une utilisation multi-machine sur la route.

Assurez-vous que votre service fonctionne réellement via TaskManager. Si ce n'est pas le cas, placez une instruction Debugger.Break() dans le constructeur de votre service et parcourez pour trouver où il ne démarre pas. Here est une étape concise pour créer un service Windows NT en C# (si vous en avez besoin).

+0

Le service est en cours d'exécution et fait son travail. –

0

Rien dans le journal des événements sur l'échec d'enregistrer l'adresse?

avez-vous essayé de déboguer le service (à l'aide de visual studio attach to process)?

0

Avez-vous vérifié que cette configuration est définie dans les fichiers de configuration pour l'application WinForms et pour le service?

Questions connexes