web-dev-qa-db-de.com

System.ServiceModel.AddressAccessDeniedException: HTTP konnte die URL http :: 8080 nicht registrieren

Ich habe meinen ersten selbst gehosteten WCF-Dienst erstellt. Ich habe es in einer C # -Konsolen-App gehostet, aber es wird ein Fehler ausgegeben: 

System.ServiceModel.AddressAccessDeniedException: HTTP konnte die URL http: 8080 nicht registrieren

Wenn Sie Visual Studio 2013 als Administrator ausführen, funktioniert es gut, aber nicht, wenn ich es nicht mache. Also eine Möglichkeit, es automatisch zu erledigen, anstatt VS als ADMIN zu starten?

Bisher habe ich eine HelloService-Klassenbibliothek erstellt, in der ich einen WCF-Service hinzugefügt habe, der aus der Schnittstelle IHelloService und HelloService besteht.

IHelloService:

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

HelloService:

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

Dann habe ich eine C # -Konsolen-App HelloServiceHost erstellt, die eine app.config-Datei hat:

<?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> 

und program.cs-Datei:

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();
            }
        }
    }
}

Ich habe genau ein Video-Tutorial verfolgt, aber es funktioniert nicht warum?

Ich verwende VS 2013, .net 4

20
user3432348

Starten Sie die cmd als Administrator und geben Sie Folgendes ein:

netsh http add urlacl url = http: // +: 8080/MyUri user = DOMÄNE\benutzer

das hat für mich funktioniert.

19
franconegro

Ich bin bei einem anderen Projekt auf dasselbe Problem gestoßen.

Das Problem ist, dass die Bindung an einen TCP-Port Administratorrechte erfordert. Es gibt ein paar Möglichkeiten, damit umzugehen.

  1. Lassen Sie einen Verwaltungsbefehl Eingabeaufforderung geöffnet. Dann können Sie die Konsolen-App direkt ausführen.

  2. (Wie Sie vorgeschlagen haben), führen Sie VS als Administrator aus. Dies ist nur beim Debuggen Ihrer App unbedingt erforderlich.

  3. Erstellen Sie eine ausführliche Datei für die Anwendung, indem Sie requestExecutionLevel level = "requirAdministrator" angeben. Siehe Wie erzwinge ich, dass meine .NET-Anwendung als Administrator ausgeführt wird? für mehr Details.

18
Taladon

Die URL des Stammpfads ( http: // +: 8080/ ) ist in Ihrem Fall erforderlich:

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

alle URL-Reservierungen anzeigen:

netsh http show urlacl | FIND "URL"
3

Wenn Sie beim Starten des Diensts unter Windows-Dienst auf diesen Fehler gestoßen sind, können Sie das Konto in Ihrem Prozessinstallationsprogramm überprüfen.

[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