Registrando a URL HTTP para serviços WCF


Quando você está desenvolvendo um serviço WCF, e o usuário que utiliza para rodar a aplicação de hosting não tem privilégios administrativos, provavelmente você irá se deparar com a seguinte mensagem de erro:

AddressAccessDeniedException: HTTP could not register URL http://+:8080/Servico.  Your process does not have access rights to this namespace.

Ao rodar a aplicação que efetuará o hosting do serviço, o WCF recorre ao HTTP.sys (componente para comunicação HTTP sem uso do IIS) para criar a URL onde o serviço será exposto. Depois da URL criada, essas requisições serão encaminhadas para o respectivo serviço que efetuou o registro. No entanto, para efetuar o registro, você precisa de privilégios administrativos que, eventualmente, você não tenha.

Para resolver esse problema você pode rodar como “Administrador” (mas você já sabe a implicação disso), ou recorrer a uma ferramenta de linha de comando chamada netsh.exe. Dado a URL e o usuário, ele permite o acesso à URL à este usuário, através de ACLs. Abaixo o código que você deve executar (como “Administrador”) para conceder o acesso:

netsh http add urlacl url=http://+:80/Servico user=IANB01IsraelAece

Anúncios

10 comentários sobre “Registrando a URL HTTP para serviços WCF

  1. Sim ele sobe direitinho, consumo o serviço e etc.
    Mas quando vou atualizar o serviço que já esta no ar ele fecha o host e faz o unload do appdomain ai quando vai abrir o host para a nova verssão ele da erro dizendo que a url já existe no HTTP.SYS.

    Bem que o Galuppo disse que voce é um cara gente boa 🙂

    Muito obrigado pela ajuda

    • Israel, eu preciso fazer ao contrario, estou tendo o seguinte erro :
      O HTTP não pôde registrar a URL http://+:8111/AutenticacaoSvc/. Outro aplicativo já registrou essa URL com HTTP.SYS.
      Estou rodando um host em console applicatiom com System.Monitor, o serviço já esta de pé quando copio uma nova verssão da DLL ele remove do host e tenta criar novamente a hora que vai startar o host ocorre o erro acima.

      Como faço para remover a url do HTTP.SYS ?

      desde já agradeço

    • Israel,

      Tenho um host (console application) ele fica monitorando as dll (serviço) se são apagadas ou alteradas usando FileSystemWatcher.
      Quando eu altero uma dll(seriço) eu primeiramente eu removo AppDomain.Unload(appDomains[assemblyFile]); e depois eu crio AppDomain appDomain = RemoteProxy.Start(assemblyFile);

      Adiciono os endpoint
      foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
      {
      Console.ForegroundColor = ConsoleColor.White;
      Console.WriteLine(" {0}", endpoint.Address);
      endpoint.Behaviors.Add(new MonitorBehavior());
      }

      e na hora de host.Open(); ele ocorre aquela exception dizendo que a url já existe no http.sys

      Este exemplo eu baixei do

      http://www.codeproject.com/KB/WCF/generic_wcf_host.aspx

      Obrigado pela ajuda

    • Boas Henrique,

      Dei uma olhada superficial no artigo, e pude perceber que ele cria um AppDomain.

      Sendo assim, certifique-se que ao detectar a mudança, o host está mesmo sendo encerrado. Tente analisar a stack trace, e com ela, tentar encontrar os passos que estão sendo realizados durante o load/unload dos assemblies.

    • Sim o host esta sendo encerrado quando ele detecta uma mudança, ai quando vai dar um open no host ele dis que a url já esta registrada no http.sys.
      Tem como remover essa url do HTTP.SYS ?

    • Israel, estou tendo o mesmo problema, você pode dizer qual foi a solução dada ao problema do Henrique Bronze?

      Att,
      Bruno

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s