HTTP n'a pas pu enregistrer l'URL http: // +: 8000 / HelloWCF /. Votre processus n'a pas de droits d'accès à cet espace de noms

179

Je suis un débutant en WCF, mais j'essaie d'améliorer mon expérience. Et lors de la première étape, j'ai fait face au problème. J'ai créé le service WCF le plus simple. La liste du code: (tout le code dans un seul fichier)

using System;
using System.ServiceModel;

namespace EssentialWCF
{
    [ServiceContract]
    public interface IStockService
    {
        [OperationContract]
        double GetPrice(string ticker);
    }

    public class StockService : IStockService
    {
        public double GetPrice(string ticker)
        {
            return 94.85;
        }
    }

    class Service
    {
        static void Main(string[] args)
        {
            ServiceHost serviceHost = new ServiceHost(typeof(StockService),
                                                        new Uri("http://localhost:8000/HelloWCF"));

            serviceHost.AddServiceEndpoint(typeof(IStockService), new BasicHttpBinding());
            serviceHost.Open();

            Console.WriteLine("To continue press ENTER");

            serviceHost.Close();
        }
    }
}

Ce serait le service qui me donnerait un numéro via la console. Mais le débogage me donne l'exception: (au lieu du nombre :))

HTTP n'a pas pu enregistrer l'URL http: // +: 8000 / HelloWCF / . Votre processus ne dispose pas des droits d’accès à cet espace de noms (voir http://go.microsoft.com/fwlink/?LinkId=70353 pour plus de détails).

Avez-vous déjà fait face à la même situation? Je serai heureux de voir tous les conseils.

valecoder
la source
Je suis confus. Ce texte échappé HTML est-il censé faire partie du code?
Amy
1
regardez ici pour une autre option [ stackoverflow.com/questions/885744/…
shankbond

Réponses:

231

Malheureusement, le lien dans le texte d'exception, http://go.microsoft.com/fwlink/?LinkId=70353 , est rompu. Cependant, il conduisait à http://msdn.microsoft.com/en-us/library/ms733768.aspx qui explique comment définir les autorisations.

Il vous informe essentiellement d'utiliser la commande suivante:

netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\user

Vous pouvez obtenir plus d'aide sur les détails à l'aide de netsh

Par exemple: netsh http add ?

Donne de l'aide sur la http addcommande.

Bryan
la source
3
Cette méthode est également utile pour configurer les autorisations requises sur un serveur de test automatisé.
Technobabble
8
Assurez-vous d'exécuter la commande à partir d'une invite de commande administrateur.
mbonness le
3
Si vous n'êtes pas sur un domaine, utilisez simplement COMPUTER_NAME\USER_NAMEla commande ci-dessus.
dotNET
vous pouvez l'exécuter netsh http add urlacl url=http://+:80/ user=DOMAIN\usersi vous souhaitez donner au compte des droits d'accès à tous les espaces de noms sur le port.
Hamid Heydarian
devrait-il être fait sur la machine cliente ou sur le serveur ou les deux? et que faut-il utiliser dans http: //? l'adresse IP du client ou du serveur? Comme d'habitude, l'aide est inutile
GuidoG
177

J'ai fermé l'IDE de Visual studio et l'ai rouvert en faisant un clic droit sur l'icône de Visual Studio et en disant "Exécuter en tant qu'administrateur", puis quand j'ai exécuté l'hôte, cela a fonctionné !!!

John Royceton Arthur
la source
17
Tout d'abord, c'est une mauvaise pratique bien que Visual Studio ne laisse que peu de choix ici. Deuxièmement, le problème demeure à d'autres étapes (par exemple, déployées). Voir la réponse de Bryan ou blogs.msdn.com/b/paulwh/archive/2007/05/04/…
Stéphane Gourichon
3
Bon chagrin! Friggin MS, créant des fonctionnalités différentes qui se combattent. Voilà pour le «moindre privilège».
Dan Csharpster
1
Meilleure pratique ou non, c'est sur MS. Pourquoi est-ce que WCF / .NET est si spécial qu'il a besoin d'un autre cercle pour passer à travers? Si j'écris un service en Java fonctionnant sous Windows, bang ça marche localement. Si je veux le rendre public, j'ajuste le pare-feu, le commutateur, le routeur, etc.
Kai Wang
1
-1. Ce n'est pas la bonne chose à faire. Vous devez accorder une autorisation explicite à un utilisateur restreint et l'utiliser. La réponse de @ Bryan ci-dessous est meilleure.
Daniel James Bryars
2
-1. C'est la même chose que de reformater le disque dur lorsqu'il y a un problème et de dire que le problème est résolu. La réponse est, comme il a été souligné, d'exécuter netssh
Stan Bashtavenko
19

Cliquez avec le bouton droit sur Visual Studio> Exécuter en tant qu'administrateur> Ouvrez votre projet et exécutez le service. Il s'agit d'un problème lié aux privilèges.

user3264537
la source
A travaillé pour moi. Merci!
Losbear
14

Vous avez besoin d'un privilège d'administrateur sur votre compte si votre machine est dans le réseau local, puis vous appliquez un privilège d'administrateur à votre utilisateur sinon vous devez démarrer ide en tant qu'administrateur ...

Pramod Lawate
la source
2
C'est ce que je devais faire pour mon service Windows WCF. J'utilisais un nouveau compte de domaine pour exécuter le service sur une machine de construction. Mon service démarrerait puis lèverait cette exception. Une fois que je lui ai donné les droits d'administrateur, cela a parfaitement fonctionné.
thehelix
Cela a résolu le problème pour moi. Faites un clic droit sur le service, et dans l'onglet "
Connexion
11

La chose simple que vous devez faire est de fermer votre environnement Visual Studio et de l'ouvrir à nouveau en utilisant «Exécuter en tant qu'administrateur». Il devrait maintenant fonctionner correctement.

Mahesh.P
la source
18
L'exécution en tant qu'administrateur évite seulement les problèmes, cela ne les résout pas.
ProfK
6

Dans Windows Vista et les versions ultérieures, le service HTTP WCF entraînerait l'exception que vous avez mentionnée car un compte restreint n'a pas le droit pour cela. C'est la raison pour laquelle cela a fonctionné lorsque vous l'avez exécuté en tant qu'administrateur.

Chaque développeur sensé doit utiliser un compte RESTRICTED plutôt qu'en tant qu'administrateur, mais beaucoup de gens se trompent et c'est précisément pourquoi il existe tant d'applications qui DEMANDENT des autorisations d'administrateur lorsqu'elles ne sont pas vraiment nécessaires. Travailler de manière paresseuse aboutit à des solutions paresseuses. J'espère que vous travaillez toujours dans un compte restreint (mes félicitations).

Il existe un outil (à partir de 2008 environ) appelé NamespaceManagerTool si je me souviens bien, qui est censé accorder les autorisations utilisateur restreintes sur ces URL de service que vous définissez pour WCF. Je ne l'ai pas utilisé cependant ...

Seigneur des scripts
la source
L'outil auquel vous pensez s'appelle Http Namespace Manager. Il n'est pas pris en charge par MS mais il est disponible ici: blogs.msdn.com/b/paulwh/archive/2007/05/04/…
Gareth
1

Votre exemple de code ne fonctionnera pas comme indiqué car vous avez oublié d'inclure un Console.ReadLine()avant la serviceHost.Close()ligne. Cela signifie que l'hôte est ouvert puis immédiatement fermé.

En dehors de cela, il semble que vous ayez un problème d'autorisation sur votre machine. Assurez-vous que vous êtes connecté en tant que compte administrateur sur votre machine. Si vous êtes un administrateur, il se peut que le service de publication World Wide Web (W3SVC) ne soit pas en cours d'exécution pour gérer les requêtes HTTP.

Sixto Saez
la source
J'ai déjà résolu ce problème et ce n'est pas à cause de mon compte cmd et (bien sûr) pas à cause de ReadLine () - car le point est dans l'exception (pas le résultat cmd).
valecoder le
J'ai résolu cela avec stackoverflow.com/questions/885744/… .
valecoder
1

Bien que j'aie pu résoudre ce problème sur un ordinateur en suivant les solutions des autres utilisateurs, la commande netshn'a pas résolu le problème sur l'une de mes machines et même si l'utilisateur actuel avait des droits d'administrateur, j'obtenais toujours le message "HTTP ne pouvait pas enregistrer l'URL .... Votre processus n'a pas de droits d'accès à cet espace de noms ". Je partage donc ma solution au cas où vous ne la feriez toujours pas fonctionner avec les autres solutions.

Après avoir également essayé d'accorder des autorisations d'écriture à l'utilisateur dans le répertoire physique de mon site Web sans succès, j'ai finalement décidé d'essayer de modifier les paramètres IIS. .

Comme le montrent les images ci-dessous, j'ai configuré les informations d' identification du chemin physique de mon site Web pour se connecter en tant qu'utilisateur spécifique, qui était un compte administrateur avec DOMAINE \ nom d'utilisateur et mot de passe, et cela a suffi à faire disparaître l'erreur.

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

Ulysse Alves
la source
-1

Fermez iis express et tous les navigateurs (si l'URL a été ouverte dans l'un des navigateurs). Ouvrez également l'IDE de Visual Studio en mode administrateur. Cela a résolu mon problème.

Lokesh
la source
Cela n'a pas résolu le problème. L'utilisation d'un IDE en mode administrateur est un autre problème et probablement plus sérieux.
Preza8