在TopShelf下运行Nancy Self Host

RMi*_*man 3 topshelf nancy

我在工作中使用topShelf写了一个Nancy Self-Hosted服务(Windows 7),它运行得很好.我把它带回家并在Windows 10下运行它,我收到以下错误:

Nancy自托管无法启动,因为提供的URL没有存在名称空间保留.

请在提供给NancyHost的HostConfiguration上自动启用UrlReservations.Create,或使用(提升的)命令手动创建预留:

netsh http add urlacl url ="http:// +:5000 /"user ="Everyone"

我看到了这个建议:

HostConfiguration hostConfigs = new HostConfiguration()
{
    UrlReservations = new UrlReservations() { CreateAutomatically = true }
};
Run Code Online (Sandbox Code Playgroud)

但它似乎只能在运行自己的主机时运行,而不是使用TopShelf.这是我的主要代码:

    public static void Main()
    {
        HostFactory.Run(x =>
        {
            //x.UseLinuxIfAvailable();
            x.Service<SelfHost>(s =>
            {
                s.ConstructUsing(name => new SelfHost());
                s.WhenStarted(tc => tc.Start());
                s.WhenStopped(tc => tc.Stop());
            });

            x.RunAsLocalSystem();
            x.SetDescription("SciData Recipe Data Interaction");
            x.SetDisplayName("SciData.Recipe Service");
            x.SetServiceName("SciData.Recipe");
        });
    }
Run Code Online (Sandbox Code Playgroud)

有人可以建议如何解决这个问题,以便在Windows 10下运行吗?谢谢...

更新:以下工作:以管理员身份运行命令shell并键入以下内容似乎使一切正常.

netsh http add urlacl url=http://+:1234/ user=DOMAIN\username
Run Code Online (Sandbox Code Playgroud)

1234是服务使用的端口.我仍然想知道如何在代码中执行此操作,但如果这不起作用,这就足够了.

JPe*_*ier 5

看看Topshelf.Nancy也可以作为NuGet包使用.它在您安装服务时为您执行URL Reservation(netsh http).卸载服务时也会删除它.

  1. 将Topshelf.Nancy添加到您的项目中
  2. 将"WithNancyEndpoint"添加到您的服务中

你的代码:

public static void Main()
{
    HostFactory.Run(x =>
    {
        //x.UseLinuxIfAvailable();
        x.Service<SelfHost>(s =>
        {
            s.ConstructUsing(name => new SelfHost());
            s.WhenStarted(tc => tc.Start());
            s.WhenStopped(tc => tc.Stop());
            s.WithNancyEndpoint(x, c =>
            {
                c.AddHost(port: 1234);
                c.CreateUrlReservationsOnInstall();
            });
        });

        x.RunAsLocalSystem();
        x.SetDescription("SciData Recipe Data Interaction");
        x.SetDisplayName("SciData.Recipe Service");
        x.SetServiceName("SciData.Recipe");
    });
}
Run Code Online (Sandbox Code Playgroud)