J'écris un serveur HTTP en C #.
Quand j'essaye d'exécuter la fonction, HttpListener.Start()
je reçois un HttpListenerException
dicton
"Accès refusé".
Lorsque j'exécute l'application en mode administrateur dans Windows 7, cela fonctionne bien.
Puis-je le faire fonctionner sans le mode administrateur? si oui comment? Sinon, comment puis-je faire passer l'application en mode administrateur après le démarrage?
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
la source
la source
Réponses:
Oui, vous pouvez exécuter HttpListener en mode non-administrateur. Tout ce que vous avez à faire est d'accorder des autorisations à l'URL particulière. par exemple
La documentation est ici .
la source
httpListener.Prefixes.Add("http://*:4444/");
doit correspondre EXACTEMENT à celle de lanetsh
commande. Par exemple, j'ai euhttpListener.Prefixes.Add("http://127.0.0.1:80/");
la mêmenetsh
commande que vous, et l'exception HttpListenerException sera toujours lancée. J'avais besoin de changerhttpListener.Prefixes.Add("http://+:80/");
Merci pour votre aide @Darrel Miller, parce que vous m'avez mis sur la bonne voie 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 une telle URL, et il semble dommage d'exiger qu'un administrateur l'installe sur 50 ordinateurs de bureau, juste pour ce seul but.Vous ne pouvez pas, cela doit commencer par des privilèges élevés. Vous pouvez le redémarrer avec le
runas
verbe, qui invitera l'utilisateur à passer en mode administrateurEDIT: en fait, ce n'est pas vrai; HttpListener peut s'exécuter sans privilèges élevés, mais vous devez donner l'autorisation pour l'URL sur laquelle vous souhaitez écouter. Voir la réponse de Darrel Miller pour plus de détails.
la source
Si vous utilisez
http://localhost:80/
comme préfixe, vous pouvez écouter les requêtes http sans avoir besoin de privilèges administratifs.la source
http://localhost:80/
et j'ai obtenu un "Accès refusé".httpListener.Prefixes.Add("http://*:4444/");
montre en effet uneAccess Denied
erreur maishttpListener.Prefixes.Add("http://localhost:4444/");
fonctionne sans aucun problème. Il semble que Microsoft soit exclulocalhost
de ces restrictions. Fait intéressant,httpListener.Prefixes.Add("http://127.0.0.1:4444/");
montre toujours une erreur d'accès refusé, donc la seule chose qui fonctionne estlocalhost:{any port}
La syntaxe était incorrecte pour moi, vous devez inclure les guillemets:
sinon j'ai reçu "Le paramètre est incorrect"
la source
/
sur l'urlSi vous souhaitez utiliser l'indicateur "utilisateur = Tout le monde", vous devez l'adapter à la langue de votre système. En anglais, c'est comme mentionné:
En allemand, ce serait:
la source
Comme alternative qui ne nécessite pas d'élévation ou de 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
Les méthodes de lecture et d'écriture étant:
la source
new UTF8Encoding(false)
, qui désactive l'émission d'une nomenclature. J'ai déjà changé cela dans la réponseVous pouvez démarrer votre application en tant qu'administrateur si vous ajoutez le manifeste d'application à votre projet.
Ajoutez simplement un nouvel élément à votre projet et sélectionnez "Fichier manifeste de l'application". Remplacez l'
<requestedExecutionLevel>
élément par:la source
Par défaut, Windows définit le préfixe suivant qui est accessible à tous: http: // +: 80 / Temporary_Listen_Addresses /
Vous pouvez donc enregistrer votre
HttpListener
via:Prefixes.Add("http://+:80/Temporary_Listen_Addresses/" + Guid.NewGuid().ToString("D") + "/";
Cela pose parfois des problèmes avec des logiciels tels que Skype qui essaieront d'utiliser le port 80 par défaut.
la source
vous utilisez "*" donc vous exécutez la commande suivante en tant qu'administrateur
pas d'utilisation +, doit utiliser *, car vous spécifiez *: 4444 ~.
https://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx
la source
.Add("http://+:9000/")
J'ai également rencontré un problème similaire.Si vous avez déjà réservé l'URL, vous devez d'abord supprimer l'URL pour l'exécuter en mode non administrateur, sinon elle échouera avec l'erreur Access is Denied.
la source