2008-11-11 21 views
14

Estoy desarrollando una aplicación que hasta ahora está utilizando HttpListener para proporcionar un pequeño servidor http independiente. Sin embargo, recientemente descubrí que HttpListener necesita ejecutarse como administrador, lo que no siempre será posible.alternativa a HttpListener?

¿Cuál sería la mejor alternativa? Necesito http GET y POST, que no son solo leer/escribir archivos en el sistema de archivos, sino que necesitan ejecutar un código .Net personalizado.

Mi investigación hasta ahora ha sacado a relucir a Cassini, pero hasta donde puedo decir, tendría que escribir una versión personalizada. ¿Hay algo mas? En partiular algo con la misma interfaz que HttpListener, pero que no requiere privilegios de administrador sería increíble!

+9

HttpListener no necesita ser ejecutado como administrador si hace las cosas correctas "netsh http add urlacl ..." primero –

Respuesta

8

Una alternativa que he encontrado es C# Webserver en CodePlex.

"... un servidor http flexible que puede ser incrustado en cualquier aplicación .Net. Tiene un diseño modular donde se añaden funciones usando módulos. El servidor también soporta REST y todos los verbos HTTP ..."

Tiene una clase HttpListener que imagino que es similar a System.Net.HttpListener, pero aún no he usado ninguna de ellas, así que no puedo estar seguro.

+0

Creo que está basado en socket, no necesita privilegios de administrador. –

+0

woops, el enlace de Chris Kimpton apunta al mismo proyecto, solo en CodeProject en lugar de CodePex. –

3

Una solución para esto está cubierta por this other question - puede darse permisos para ejecutar HttpListener como no administrador.

Puede hacer que la aplicación se inicie desde un archivo de comando que clasifica los permisos y luego ejecuta la aplicación real.

+0

Esto no es realmente una opción ya que la aplicación debe ser tan fácilmente instalable como una aplicación de escritorio normal. – Grokys

+0

He pasado por la ruta netsh. Supongo que puedo ejecutar el comando netsh como parte del instalador. Muchos instaladores solicitan permisos elevados, incluso cuando la aplicación no lo hace. –

0

Ok, entonces usted tiene una aplicación de escritorio normal que necesita permitir conexiones http entrantes - hmm - ¿no será el firewall de Windows un problema?

Asumiendo que no, suena casi como un servicio web, ¿podría ir por esa ruta? ¿Exponer las URL a través de eso? Aunque mi conocimiento de .Net no es lo suficientemente profundo como para saber si todavía necesita ejecutar un servidor http específico para responder a las solicitudes. Spring.Net es probablemente digno de un vistazo.

+0

No, solo recibirá conexiones de localhost; la aplicación es un proxy para una aplicación de Adobe AIR que se instala al mismo tiempo. – Grokys

+0

Además, he considerado los servicios web, pero el servidor estará principalmente sirviendo binarios, lo cual no es una buena opción para los servicios web. – Grokys

3

Al igual que el comentario de Will Dean en su mensaje dice, puede ejecutar el siguiente comando netsh:

netsh http add urlacl url=http://+:8346/ user="NTAuthority\Authenticated Users" sddl="D:(A;;GX;;;AU)" 

Sustituto de la 'http: // +: 8346 /' con su valor, y esto permitirá cualquier usuario autenticado para ejecutar el servidor web en el punto final de destino.

+0

Esto no funcionó para mí; da como resultado que el sistema escuche HTTP en el puerto determinado, pero rechaza todas las conexiones con 503 Service Unavailable. – jimrandomh

+0

@jimrandomh - Intente poner en su dominio completo para el registro. Ejemplo: 'netsh http add urlacl url = http: //www.mytestdomain.com: 8346/user =" NTAuthority \ Usuarios autenticados "sddl =" D: (A ;; GX ;;; AU) "' [Además, puede verificar/modificar sus reservas de URL con esta herramienta - http://urlreservation.codeplex.com/](http://urlreservation.codeplex.com/) – ctrlplusb

+0

Y no olvide las configuraciones de su firewall también. :) Tu firewall puede estar bloqueando conexiones. Intente desactivarlo temporalmente y luego intente conectar nuevamente para asegurarse de que este no sea el problema. – ctrlplusb

2

cuanto a la declaración:

he descubierto recientemente que HttpListener se debe ejecutar como administrador

Eso no es del todo cierto y algunas de las otras respuestas toque en una de las razones, pero hay otro:

  1. Observado por otros carteles: puede otorgar permisos a un no administrador. Bien, pero no genial.
  2. Puede escuchar en localhost, incluso en el puerto 80, sin ser administrador. Nota: Recuerdo que solo funciona "localhost" y no "127.0.0.1" ... así que asegúrese de pasar localhost a su llamada Prefixes.Add.

Estamos envío de una herramienta interna que permite a los desarrolladores ejecutar un host de aplicaciones basadas en HTTP en sus PC y en un primer momento pensaron usando HttpListener no sería posible debido a la administración (o permisos de administrador-sentado) problema , pero luego encontramos que localhost funciona bien sin ser un administrador. Tiene sentido: escuchar externamente es "peligroso", pero escuchar en la máquina local no es tan peligroso.

0

Nowin es una gran lib que se puede integrar en Owin como ServerFactory sin dependencia en HttpListener. Pudimos soltar en reemplazar Microsoft.Owin.Host.HttpListener lib sin un enganche

+0

Hola, estoy atrapado en el mismo punto. ¿Me pueden ayudar a reemplazar el HttpListener? –