Problème avec l'hébergement du service WCF dans un service Windows
J'ai un service WCF qui est hébergé à l'intérieur d'un Service Windows. Le Service Windows dispose d'un OnStart
méthode comme ceci:
protected override void OnStart(string[] args)
{
serviceHost = new ServiceHost(typeof (RouterService));
serviceHost.Open();
}
C'est tout à fait minime maintenant, depuis que je suis en train d'essayer de trouver le problème. Depuis, je n'ai pas mis toute erreur de manipulation ici, toutes les exceptions à ce point devrait avoir arrêté le service de démarrer correctement. Ce serait pour commencer, et puis arrête automatiquement de nouveau immédiatement.
Mon fichier de configuration pour le service WCF ressemble à ceci:
<?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>
En outre, j'ai ajouté le SERVICE de RÉSEAU de l'utilisateur (qui exécute le service de pouvoir écouter Http sur le port spécifié:
netsh http add urlacl url=http://+:8000/user="NETWORK SERVICE"
Maintenant, dans le client, j'ai choisi de Add Service Reference
. Je peut trouver le serveur, et VS aussi réussi à créer la configuration et de rendre les fichiers proxy. Ensuite, à l'intérieur du client, j'ai créer une instance du proxy, et de l'ouvrir. Le tout toujours très bien. Mais lors de l'appel de la première méthode sur le proxy, j'obtiens l'exception suivante:
Le service HTTP situé à http://localhost:8000/RouterService est trop occupé.
Je sais que mon client est la seule chose qui tente de se connecter à ce service, alors pourquoi je reçois ce message d'erreur alors? Et comment puis-je résoudre ce problème? Il n'a pas le temps lorsqu'il tente d'appeler la méthode, il lève l'exception presque immédiatement.
MODIFIER
Ok, maintenant j'ai découvert que mon TestServer (pas le Client Windows, mais une application console) donne la même erreur. Plus tôt aujourd'hui, elle n'a pas, et ni le service WCF ou TestServer sont modifiées.
Puis j'ai essayé de changer le port 8080 au lieu de 8000, et cela a fonctionné. Ensuite, j'ai essayé la même chose pour le Service de Windows, et qui a également travaillé (après l'exécution de la netsh http
commande sur le nouveau port)
Donc, quelque chose s'est passé pour le protocole http sur le port 8000 pour une raison quelconque. J'ai essayé de redémarrer le système aussi bien sûr.
C'est étonnant de moi, alors si quelqu'un a une idée de ce qui se passe ici, je l'apprécierais.
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Ok, après un long temps d'essayer de comprendre ce qui s'est passé ici, j'ai trouvé la solution.
Après, j'ai créé le service de windows, et j'ai essayé de le démarrer, je ne pouvais pas parce que j'ai eu à enregistrer l'utilisateur du SERVICE RÉSEAU à écouter sur http post 8000 premier. J'ai donc exécuté cette commande:
netsh http ajoutez urlacl url=http://+:8000/RouterService utilisateur="SERVICE RÉSEAU"
Il a donné un résultat positif, mais ensuite, j'ai essayé de démarrer le service, et a obtenu le même message d'erreur. Ensuite, j'ai couru la même commande sans RouterService spécifié:
netsh http ajoutez urlacl url=http://+:8000/utilisateur="SERVICE RÉSEAU"
Il a donné un résultat positif, et maintenant mon windows service a démarré sans problème, mais j'ai eu le problème mentionné dans la question ci-dessus.
Il semble que le premier appel à netsh cause l'ensemble de ces problèmes. J'ai essayé de l'enlever à nouveau avec cette commande:
netsh http supprimer urlacl url=http://+:8000/RouterService
Et puis tout a parfaitement fonctionné.
Une chienne pour déboguer ce depuis l'exception n'avait rien à voir avec le problème, j'espère donc que cette question peut sauver quelqu'un d'autre une couple d'heures 🙂
De réponse suivant de @oyvind-knobloch-brathen envisager d'utiliser bien connu SID chaînes au lieu de "utilisateur" de la ligne de commande de la clé, ce qui vous donnera de la croix de la culture de la portabilité (j'ai eu des soucis française localisée Win7 machine). Pour plus d'informations, voir Chaînes SID. Pour votre cas ce sera:
netsh http ajoutez urlacl url=http://+:8000/sddl="O:NS"
un lien vers SDDL sur MSDN.