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
Ответы
Ответ 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"