【问题标题】:cant start nancy self host without admin rights没有管理员权限无法启动 nancy 自我主机
【发布时间】:2013-04-10 11:49:01
【问题描述】:

我的应用使用 Nancy Selfhosting。当我在没有管理员权限的情况下启动它时,我得到一个 System.Net.HttpListenerException "Access Denied"。

代码如下:

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

我也尝试了不同的端口,但没有成功。奇怪的是,在启动监听相同 URL 的 HttpListener 时,我没有收到任何异常。什么可能导致此异常?

【问题讨论】:

  • 端口 80 上是否已经有东西在运行?
  • 我认为您的HttpListener 测试存在缺陷。当我在 Windows 7 上没有被提升时,我在 .GetContext() 期间被拒绝访问。
  • 当然,我的程序中还有更多应用程序逻辑。整个应用程序与围绕 HttpListener 构建的“自建”Web 服务器完美配合。由于可扩展性等原因,我只是想使用 nancy。但是对于我们的客户来说,必须以管理员权限启动它。

标签: c# nancy


【解决方案1】:

您需要将自主机配置设置为不通过RewriteLocalhost property重写本地主机路由。

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

我通过尝试和失败发现了这一点,但是this page explains the reason behind.

【讨论】:

  • 但是它只允许我访问来自localhost的地址而不是机器的ip,否则客户端会看到400错误。你知道如何解决这个问题吗?
  • @JeffreyZhao 看看 Ashtonian 的回答。
  • @robpnv 更改 ACL 需要管理员权限。
  • 帮助解决了 Win 7 和 Win 10 安装之间的问题。谢谢
【解决方案2】:

或者-来自documentation

请注意,在 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 托管 Nancy。真的很简单:

    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 来解决所有的依赖关系。

    【讨论】:

      猜你喜欢
      • 2012-06-25
      • 2016-07-19
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      相关资源
      最近更新 更多