Подтвердить что ты не робот

System.ServiceModel.AddressAccessDeniedException: HTTP не удалось зарегистрировать URL http:: 8080

Я создал свою первую самостоятельную службу WCF. Я размещал его в консольном приложении С#, но он выдавал ошибку:

System.ServiceModel.AddressAccessDeniedException: HTTP не удалось зарегистрировать URL http: 8080

Когда я запускаю Visual Studio 2013 как администратор, тогда он работает хорошо, но нет, если я этого не делаю. Итак, любой способ сделать это автоматически, а не запускать VS как ADMIN?

До сих пор я создал библиотеку классов HelloService, в которой я добавил службу WCF, которая состоит из интерфейса IHelloService и HelloService.

IHelloService:

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

HelloService:

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

Затем я создал консольное приложение С# HelloServiceHost, у которого есть файл 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> 

и файл 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();
            }
        }
    }
}

Я точно следил за видеоуроком, но он не работает почему?

Я использую VS 2013,.net 4

4b9b3361

Ответ 1

Я столкнулся с той же проблемой в другом проекте.

Проблема в том, что привязка к порту tcp требует административных привилегий. Там пара способов справиться с этим.

  • Откроется приглашение командной строки администратора. Затем вы можете просто запустить консольное приложение напрямую.

  • (Как вы предположили) запустите VS как admin. Это абсолютно необходимо только при отладке вашего приложения.

  • Создайте файл приложения, в котором указывается requestExecutionLevel level = "requireAdministrator". См. Как заставить мое приложение .NET работать под управлением администратора? для более подробной информации.

Ответ 2

Запустите cmd как Administrator и введите:

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

это сработало для меня.

Ответ 3

Если вы столкнулись с этой ошибкой при запуске службы в службе Windows, вы можете проверить учетную запись на своем установщике процесса.

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

Ответ 4

URL-адрес корневого пути (http://+:8080/) необходимы разрешения в вашем случае:

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

показать все резервирования URL-адресов:

netsh http show urlacl | FIND "URL"