Estoy escribiendo un servidor HTTP en C #.
Cuando intento ejecutar la función HttpListener.Start()
me sale un HttpListenerException
dicho
"Acceso denegado".
Cuando ejecuto la aplicación en modo administrador en Windows 7, funciona bien.
¿Puedo hacer que se ejecute sin el modo de administrador? si si como? Si no, ¿cómo puedo hacer que la aplicación cambie al modo administrador después de comenzar a ejecutar?
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
fuente
fuente
Respuestas:
Sí, puede ejecutar HttpListener en modo no administrativo. Todo lo que necesita hacer es otorgar permisos a la URL particular. p.ej
La documentación está aquí .
fuente
httpListener.Prefixes.Add("http://*:4444/");
debe coincidir EXACTAMENTE con la delnetsh
comando. Por ejemplo, teníahttpListener.Prefixes.Add("http://127.0.0.1:80/");
y el mismonetsh
comando que tiene, y la HttpListenerException todavía se lanzará. Necesitaba cambiar.httpListener.Prefixes.Add("http://+:80/");
Gracias por su ayuda, @Darrel Miller, ¡porque me ayudó a encontrar el camino correcto!The parameter is incorrect
error. Ejemplo:url=http://+:80/
http://localhost:80/
? Tengo una aplicación de escritorio que necesita recibir una solicitud en dicha URL, y parece una pena requerir que un administrador la instale en 50 escritorios, solo para este propósito.No puede, tiene que comenzar con privilegios elevados. Puede reiniciarlo con el
runas
verbo, que le indicará al usuario que cambie al modo administradorEDITAR: en realidad, eso no es cierto; HttpListener puede ejecutarse sin privilegios elevados, pero debe otorgar permiso para la URL en la que desea escuchar. Ver la respuesta de Darrel Miller para más detalles.
fuente
Si lo usa
http://localhost:80/
como prefijo, puede escuchar las solicitudes http sin necesidad de privilegios administrativos.fuente
http://localhost:80/
y obtuve un "Acceso denegado".httpListener.Prefixes.Add("http://*:4444/");
de hecho muestra unAccess Denied
error perohttpListener.Prefixes.Add("http://localhost:4444/");
funciona sin ningún problema. Parece que Microsoft está excluidolocalhost
de estas restricciones. Curiosamente,httpListener.Prefixes.Add("http://127.0.0.1:4444/");
todavía muestra un error de Acceso denegado, por lo que lo único que funciona eslocalhost:{any port}
La sintaxis fue incorrecta para mí, debes incluir las comillas:
de lo contrario recibí "El parámetro es incorrecto"
fuente
/
en la URLEn caso de que desee utilizar el indicador "usuario = Todos", debe ajustarlo al idioma de su sistema. En inglés es como se menciona:
En alemán sería:
fuente
Como alternativa que no requiere elevación o netsh, también puede usar TcpListener, por ejemplo.
El siguiente es un extracto modificado de esta muestra: https://github.com/googlesamples/oauth-apps-for-windows/tree/master/OAuthDesktopApp
Los métodos de lectura y escritura son:
fuente
new UTF8Encoding(false)
, que inhabilita la emisión de una lista de materiales. Ya he cambiado esto en la respuestaPuede iniciar su aplicación como administrador si agrega Manifiesto de aplicación a su proyecto.
Simplemente agregue un nuevo elemento a su proyecto y seleccione "Archivo de manifiesto de la aplicación". Cambia el
<requestedExecutionLevel>
elemento a:fuente
De manera predeterminada, Windows define el siguiente prefijo que está disponible para todos: http: // +: 80 / Temporary_Listen_Addresses /
Para que pueda registrar su
HttpListener
vía:Prefixes.Add("http://+:80/Temporary_Listen_Addresses/" + Guid.NewGuid().ToString("D") + "/";
Esto a veces causa problemas con software como Skype, que intentará utilizar el puerto 80 de forma predeterminada.
fuente
usa "*" para ejecutar el siguiente cmd como administrador
no use +, debe usar *, porque especifica *: 4444 ~.
https://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx
fuente
.Add("http://+:9000/")
También me enfrenté a un problema similar: si ya ha reservado la URL, primero debe eliminar la URL para ejecutarla en modo no administrativo; de lo contrario, fallará con el error Acceso denegado.
fuente