HttpListener Accès Refusé
Je suis en train d'écrire un serveur HTTP en C#.
Lorsque j'essaie d'exécuter la fonction HttpListener.Start()
- je obtenir une HttpListenerException
disant
"Accès Refusé".
Quand je lance l'application en mode administrateur sous windows 7, il fonctionne très bien.
Puis-je le faire fonctionner sans le mode admin? si oui, comment?
Si non, comment puis-je faire de l'app passer en mode administrateur) après le début de l'exécution?
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;
}
}
}
}
}
- Si quelqu'un veut éviter cette erreur, il peut essayer de l'écrire avec TcpListener. Il ne nécessite pas de privilèges d'administrateur
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez exécuter HttpListener non-mode administrateur. Tout ce que vous devez faire est d'accorder des autorisations à l'URL donnée. par exemple,
Documentation est ici.
httpListener.Prefixes.Add("http://*:4444/");
doit correspondre EXACTEMENT avec celui de lanetsh
de commande. Par exemple, j'ai euhttpListener.Prefixes.Add("http://127.0.0.1:80/");
et la mêmenetsh
de commande que vous avez, et HttpListenerException sera encore levée. J'avais besoin de changerhttpListener.Prefixes.Add("http://+:80/");
Merci pour votre aide @Darrel Miller, parce que tu as de moi sur le bon chemin pour comprendre cela!The parameter is incorrect
erreur. Exemple:url=http://+:80/
http://localhost:80/
? J'ai une application de bureau qui a besoin de recevoir une demande sur cette URL, et il semble dommage d'exiger qu'un administrateur de l'installer sur 50 postes de travail, juste pour cette fin.Vous ne pouvez pas, il a commencer avec des privilèges élevés. Vous pouvez le redémarrer avec le
runas
verbe, qui demande à l'utilisateur de basculer en mode adminEDIT: en fait, ce n'est pas vrai; HttpListener peut fonctionner sans des privilèges élevés, mais vous avez besoin de donner l'autorisation pour l'URL sur laquelle vous souhaitez écouter. Voir Darrel Miller répondre pour plus de détails.
Si vous utilisez
http://localhost:80/
comme un préfixe, vous pouvez écouter les requêtes http sans avoir besoin de privilèges d'Administration.http://localhost:80/
et a obtenu un "Accès Refusé".httpListener.Prefixes.Add("http://*:4444/");
montre en effet uneAccess Denied
erreur, maishttpListener.Prefixes.Add("http://localhost:4444/");
de travail sans aucun problème. Il ressemble à Microsoft excluslocalhost
de ces restrictions. Il est intéressant de noter,httpListener.Prefixes.Add("http://127.0.0.1:4444/");
montre encore une erreur d'Accès Refusé, de sorte que la seule chose qui fonctionne estlocalhost:{any port}
La syntaxe est mauvais pour moi, vous devez inclure les guillemets:
sinon j'ai reçu "Le paramètre est incorrect"
/
sur l'urlDans le cas où vous souhaitez utiliser le drapeau de l'utilisateur "=tout le monde", vous devez l'adapter à votre système de la langue. En anglais, il est comme il est mentionné:
En allemand, ça serait:
Comme une alternative qui ne nécessite pas d'élévation ou netsh vous pouvez également utiliser TcpListener par exemple.
Ce qui suit est un extrait modifié de cet exemple:
https://github.com/googlesamples/oauth-apps-for-windows/tree/master/OAuthDesktopApp
La lecture et l'écriture de méthodes:
new UTF8Encoding(false)
, qui désactive émettant de la NOMENCLATURE. J'ai changé cela déjà la réponseVous pouvez lancer votre application en tant qu'administrateur si vous ajoutez Manifeste de l'Application à votre projet.
Juste Ajouter un Nouvel Élément à votre projet et sélectionnez "Fichier de Manifeste d'Application". Modifier la
<requestedExecutionLevel>
élément:Par défaut de Windows définit le préfixe suivant qui est disponible pour tout le monde:
http://+:80/Temporary_Listen_Addresses/
De sorte que vous pouvez enregistrer votre
HttpListener
via:Prefixes.Add("http://+:80/Temporary_Listen_Addresses/" + Guid.NewGuid().ToString("D") + "/";
Cela provoque parfois des problèmes avec des logiciels tels que Skype, qui va essayer d'utiliser le port 80 par défaut.
vous utilisez "*" afin d'exécuter suivant cmd en tant qu'administrateur
pas d'utilisation +, doit utiliser *, parce que vous spec *:4444~.
https://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx
J'ai aussi été confronté au même problème.Si vous avez déjà réservé url, alors vous devez d'abord supprimer l'url pour s'exécuter en non en mode administrateur sinon cela échouera avec l'Accès est Refusé d'erreur.