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 для разрешения всех зависимостей.