Can not start nancy self host без прав администратора

В моем приложении используется Nancy Selfhosting. Когда я запускаю его без прав администратора, я получаю System.Net.HttpListenerException "Отказано в доступе".

Вот код:

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

Я также пробовал разные порты без успеха. Как ни странно, я не получаю никаких Исключений при запуске HttpListener, который слушает тот же Url. Что может вызвать это исключение?

Ответы

Ответ 1

Необходимо настроить конфигурацию собственного хоста так, чтобы не переписывать маршрут localhost через свойство RewriteLocalhost.

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();

            // (Change the default RewriteLocalhost value)
            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();
            }
        }
    }
}

Я выяснил это, попытавшись немного потерпеть неудачу, но эта страница объясняет причину.

Ответ 2

В качестве альтернативы - из документация:

Обратите внимание, что на хостах Windows исключение HttpListenerException может быть передано с сообщением об отказе доступа. Чтобы решить эту проблему, URL-адрес должен быть добавлен в ACL. Также, возможно, необходимо открыть порт на компьютере или корпоративном брандмауэре, чтобы разрешить доступ к службе.

Добавьте в ACL следующую команду:

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

если вам нужно удалить из ACL:

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

Ответ 3

Вы можете разместить Нэнси с Kestrel. Это очень просто:

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());
    }
}

Единственная трудность заключается в подготовке всех необходимых DLL (30+). Мы должны определенно использовать NuGet для разрешения всех зависимостей.