Estou escrevendo um servidor HTTP em c #.
Quando tento executar a função HttpListener.Start()
, recebo um HttpListenerException
ditado
"Acesso negado".
Quando executo o aplicativo no modo de administrador no Windows 7, ele funciona bem.
Posso fazê-lo funcionar sem o modo de administrador? se sim como? Caso contrário, como posso fazer o aplicativo mudar para o modo de administrador depois de começar a executar?
using System;
using System.Net;
namespace ConsoleApplication1
{
class Program
{
private HttpListener httpListener = null;
static void Main(string[] args)
{
Program p = new Program();
p.Server();
}
public void Server()
{
this.httpListener = new HttpListener();
if (httpListener.IsListening)
throw new InvalidOperationException("Server is currently running.");
httpListener.Prefixes.Clear();
httpListener.Prefixes.Add("http://*:4444/");
try
{
httpListener.Start(); //Throws Exception
}
catch (HttpListenerException ex)
{
if (ex.Message.Contains("Access is denied"))
{
return;
}
else
{
throw;
}
}
}
}
}
windows-7
c#-4.0
uac
httplistener
Randall Flagg
fonte
fonte
Respostas:
Sim, você pode executar o HttpListener no modo não administrativo. Tudo o que você precisa fazer é conceder permissões para o URL específico. por exemplo
A documentação está aqui .
fonte
httpListener.Prefixes.Add("http://*:4444/");
deve corresponder EXATAMENTE ao URL donetsh
comando. Por exemplo, eu tinhahttpListener.Prefixes.Add("http://127.0.0.1:80/");
o mesmonetsh
comando e o HttpListenerException ainda será lançado. Eu precisava mudar.httpListener.Prefixes.Add("http://+:80/");
Obrigado pela ajuda, @Darrel Miller, porque você me colocou no caminho certo para descobrir isso!The parameter is incorrect
erro. Exemplo:url=http://+:80/
http://localhost:80/
? Eu tenho um aplicativo de desktop que precisa receber uma solicitação em tal URL e parece uma pena exigir que um administrador o instale em 50 desktops, apenas para esse propósito.Você não pode, tem que começar com privilégios elevados. Você pode reiniciá-lo com o
runas
verbo, que solicitará que o usuário mude para o modo de administradorEDIT: na verdade, isso não é verdade; O HttpListener pode ser executado sem privilégios elevados, mas você precisa dar permissão para o URL no qual deseja escutar. Veja a resposta de Darrel Miller para detalhes.
fonte
Se você usar
http://localhost:80/
como prefixo, poderá ouvir solicitações http sem necessidade de privilégios administrativos.fonte
http://localhost:80/
e recebi um "Acesso negado".httpListener.Prefixes.Add("http://*:4444/");
realmente mostra umAccess Denied
erro, mashttpListener.Prefixes.Add("http://localhost:4444/");
funciona sem nenhum problema. Parece que a Microsoft foi excluídalocalhost
dessas restrições. Curiosamente,httpListener.Prefixes.Add("http://127.0.0.1:4444/");
ainda mostra um erro de Acesso Negado, então a única coisa que funciona élocalhost:{any port}
A sintaxe estava errada para mim, você deve incluir as aspas:
caso contrário, recebi "O parâmetro está incorreto"
fonte
/
na urlCaso você queira usar o sinalizador "usuário = Todos", é necessário ajustá-lo ao idioma do sistema. Em inglês, é como mencionado:
Em alemão seria:
fonte
Como alternativa que não requer elevação ou netsh, você também pode usar o TcpListener, por exemplo.
A seguir, um trecho modificado desse exemplo: https://github.com/googlesamples/oauth-apps-for-windows/tree/master/OAuthDesktopApp
Os métodos de leitura e gravação são:
fonte
new UTF8Encoding(false)
, que desativa a emissão de uma lista técnica. Eu já mudei isso na resposta #Você pode iniciar seu aplicativo como administrador se adicionar o Manifesto de Aplicativo ao seu projeto.
Basta adicionar novo item ao seu projeto e selecione "Arquivo de manifesto do aplicativo". Mude o
<requestedExecutionLevel>
elemento para:fonte
Por padrão, o Windows define o seguinte prefixo disponível para todos: http: // +: 80 / Temporary_Listen_Addresses /
Para que você possa registrar seu
HttpListener
via:Prefixes.Add("http://+:80/Temporary_Listen_Addresses/" + Guid.NewGuid().ToString("D") + "/";
Às vezes, isso causa problemas com softwares como o Skype, que tentam utilizar a porta 80 por padrão.
fonte
você usa "*" para executar o seguinte cmd como admin
não use +, deve usar *, porque você especifica *: 4444 ~.
https://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx
fonte
.Add("http://+:9000/")
Eu também enfrentei um problema semelhante. Se você já reservou o URL, primeiro exclua o URL para executar no modo não administrador, caso contrário, ele falhará com o erro Acesso negado.
fonte