2013-04-17 17 views
15

La mia app utilizza Nancy Selfhosting. Quando lo avvio senza diritti di amministratore ottengo un System.Net.HttpListenerException "Accesso negato".non può iniziare nancy self host senza diritti di amministratore

Ecco il codice:

static void Main(string[] args) 
    { 
     var nancyHost = new Nancy.Hosting.Self.NancyHost(new Uri("http://localhost:80/")); 
     nancyHost.Start(); 
     Application.Run(); 
    } 

Ho anche provato porte diverse senza successo. Stranamente, non ottengo eccezioni quando lancio un HttpListener che ascolta lo stesso Url. Cosa potrebbe causare questa eccezione?

+0

È già in esecuzione qualcosa sulla porta 80? –

+1

Penso che il test 'HttpListener' sia difettoso. Ottengo Access Denied durante '.GetContext()' quando non sono elevato su Windows 7. –

+0

Beh, naturalmente c'è un po 'più di logica applicativa nel mio programma. E l'intera applicazione funziona perfettamente con un server Web "self-build" costruito attorno a HttpListener. Volevo solo usare nancy a causa dell'espandibilità, ecc. Ma doverlo avviare con i diritti di amministratore potrebbe essere un nogo per i nostri clienti. – kroax

risposta

40

È necessario impostare la configurazione self-host per non riscrivere la route localhost.

namespace NancyApplication1 
{ 
    using System; 
    using Nancy.Hosting.Self; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var uri = 
       new Uri("http://localhost:3579"); 
      var config = new HostConfiguration(); 
      config.RewriteLocalhost = false; 

      using (var host = new NancyHost(config, uri)) 
      { 
       host.Start(); 

       Console.WriteLine("Your application is running on " + uri); 
       Console.WriteLine("Press any [Enter] to close the host."); 
       Console.ReadLine(); 
      } 
     } 
    } 
} 

Ho trovato questo da cercando e non riuscendo un po ', ma this page explains the reason behind.

+0

Ha funzionato come un fascino. – ritcoder

+0

Ma mi consente solo di accedere all'indirizzo da 'localhost' al posto dell'ip della macchina, o il client vedrà 400 errori. Hai idea di come sistemarlo? –

+0

@JeffreyZhao Dai un'occhiata alla risposta di Ashtonian. – robpvn

4

alternativa - Dal documentation:

Nota che su Windows ospita una HttpListenerException può essere gettato con un Accesso negato Messaggio. Per risolvere questo problema, l'URL deve essere aggiunto all'ACL. Inoltre, potrebbe essere necessario aprire la porta sulla macchina o sul firewall aziendale per consentire l'accesso al servizio.

Aggiungi al ACL eseguendo il comando seguente:

netsh http add urlacl url=http://+:8080/ user=DOMAIN\username 

se è necessario rimuovere dal ACL:

netsh http delete urlacl url=http://+:8080/ 
0

È possibile ospitare Nancy con Kestrel. E 'davvero semplice:

public void Main(string[] args) 
{ 
    var owinHost = new WebHostBuilder() 
     .UseStartup<Startup>() 
     .UseUrls("http://+:12345/") 
     .Build(); 

    owinHost.Run(); 
} 

public class Startup 
{ 
    public void Configure(IApplicationBuilder app) 
    { 
     app.UseOwin(x => x.UseNancy()); 
    } 
} 

L'unica difficoltà è quello di preparare tutte le DLL (30+) richiesto. Dovremmo sicuramente usare NuGet per risolvere tutte le dipendenze.

Problemi correlati