web-dev-qa-db-fra.com

System.ServiceModel.AddressAccessDeniedException: HTTP n'a pas pu enregistrer l'URL http :: 8080.

J'ai créé mon premier service WCF auto-hébergé. Je l'ai hébergé dans une application console C #, mais une erreur est générée: 

System.ServiceModel.AddressAccessDeniedException: HTTP n'a pas pu enregistrer l'URL http: 8080.

Lorsque j'exécute Visual Studio 2013 en tant qu'administrateur, cela fonctionne bien, mais pas si je ne le fais pas. Donc, un moyen de le faire automatiquement au lieu de démarrer VS en tant qu’administrateur?

Jusqu'ici, j'ai créé une bibliothèque de classes HelloService dans laquelle j'ai ajouté un service WCF qui consiste en une interface IHelloService et HelloService.

IHelloService:

namespace HelloService
{
    [ServiceContract]
    public interface IHelloService
    {
        [OperationContract]
        String GetMsg();
    }
}

HelloService:

namespace HelloService
{
    public class HelloService : IHelloService
    {
        public String GetMsg()
        {
            return "Service Accessed";
        }
    }
}

Ensuite, j'ai créé une application console C # HelloServiceHost qui contient un fichier app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors >
        <behavior name="MexBehaviour">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="HelloService.HelloService" 
               behaviorConfiguration="MexBehaviour" >
        <endpoint 
            address="HelloService" 
            binding="basicHttpBinding" 
            contract="HelloService.IHelloService"></endpoint>
        <endpoint 
            address="HelloService" 
            binding="netTcpBinding" 
            contract="HelloService.IHelloService"></endpoint>
        <endpoint 
            address="mex" 
            binding="mexHttpBinding" 
            contract="IMetadataExchange"></endpoint>
        <Host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/"/>
            <add baseAddress="net.tcp://localhost:8081/"/>
          </baseAddresses>
        </Host>
      </service>
    </services>
  </system.serviceModel>
</configuration> 

et fichier program.cs:

using HelloService;
using System.ServiceModel;

namespace HelloServiceHost
{
    class Program
    {
        static void Main(string[] args)
        {
            using(ServiceHost sh = new ServiceHost(typeof(HelloService.HelloService)))
            {
                sh.Open();
                Console.WriteLine("Host Started @"+ System.DateTime.UtcNow.ToShortDateString());
                sh.Close();
            }
        }
    }
}

J'ai suivi un tutoriel vidéo exactement mais ça ne fonctionne pas pourquoi?

J'utilise VS 2013, .net 4

20
user3432348

Lancez la commande en tant qu'administrateur et entrez:

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

cela a fonctionné pour moi.

19
franconegro

J'ai rencontré le même problème sur un projet différent.

Le problème est que la liaison à un port TCP nécessite des privilèges d'administrateur. Il y a plusieurs façons de gérer cela.

  1. Gardez une invite de commande administrative ouverte. Ensuite, vous pouvez simplement exécuter l'application de la console directement.

  2. (Comme vous l'avez suggéré), lancez VS en tant qu'administrateur. Ceci est absolument nécessaire uniquement lors du débogage de votre application.

  3. Créez un fichier Manifiest d’application en spécifiant RequestExecutionLevel level = "requireAdministrator". Voir Comment forcer mon application .NET à s'exécuter en tant qu'administrateur? pour plus de détails.

18
Taladon

Les autorisations d’URL du chemin racine ( http: // +: 8080/ /) sont nécessaires dans votre cas:

netsh http add urlacl url=http://+:8080/ user=%USERDOMAIN%\%USERNAME%

afficher toutes les réservations d'URL:

netsh http show urlacl | FIND "URL"
3
Vladimir Nikotin

Si vous rencontrez cette erreur lors du démarrage du service sur le service Windows, vous pouvez vérifier le compte sur votre installateur de processus.

[RunInstaller(true)]
public class ProjectInstaller : Installer
{
    private ServiceProcessInstaller process;
    private ServiceInstaller service;

    public ProjectInstaller()
    {
        process = new ServiceProcessInstaller();
        process.Account = ServiceAccount.LocalSystem;
        service = new ServiceInstaller();
        service.ServiceName = "WCFWindowsServiceSample";
        Installers.Add(process);
        Installers.Add(service);
    }
}
0
user3096335