Nancy.Owin 对比 Nancy.Hosting.Self 与顶架

Nancy.Owin vs Nancy.Hosting.Self with topshelf

1) 使用这两种不同的软件包进行设置有什么区别?一个比另一个更受支持吗?

我有一个使用 Nancy.Hosting.Self 的项目,但没有找到任何关于如何设置 windows 身份验证的文章,而我确实找到了 Nancy.Owin 作为中间件的文章。我现在已经切换到 Nancy.owin.

这里有几个不同的问题。

2) jsonformatter 可以在 nancy 引导程序中配置,也可以在 owin 端点 topshelf 中配置。 我应该在哪里配置格式化程序?如果在 topshelf owin 端点中配置,这是否也会应用于 nancy 引导程序?

3) 对于 topshelf 中的 nancy 端点,可以选择设置防火墙规则和 url 保留。我在 owin 端点找不到这个。

private static void CreateHost(HostConfigurator host)
    {
        var logger = SetupLogging();
        host.UseSerilog(logger);
        host.UseLinuxIfAvailable();
        //sc => serviceconfigurator, ls => licenseService
        host.Service<WebService>(sc =>
        {
            sc.ConstructUsing(name => new WebService(_config));
            sc.WhenStarted(ls => ls.Start());
            sc.WhenStopped(ls => ls.Stop());
            sc.OwinEndpoint(app =>
            {
                app.ConfigureHttp(configuration =>
                {
                    //use json.net serializer
                    configuration.Formatters.Clear();
                    configuration.Formatters.Add(new JsonMediaTypeFormatter());

                    //configure json settings
                    var jsonSettings = configuration.Formatters.JsonFormatter.SerializerSettings;
                    jsonSettings.Formatting = Formatting.Indented;
                    jsonSettings.Converters.Add(new StringEnumConverter { CamelCaseText = false, AllowIntegerValues = true });
                    jsonSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                });
                app.ConfigureAppBuilder(builder =>
                {
                    builder.UseNancy(options =>
                    {
                        options.Bootstrapper = new Bootstrapper(_config);
                        //options.PerformPassThrough
                    });
                });
                app.ConfigureStartOptions(options =>
                {
                    options.Port = _config.LicenseServicePort;
                    //options.Urls = new List<string>(){};
                });
            });

            //add host reservation during service install, this is the only time, nancy will have admin rights, will be deleted when service is uninstalled as well.
            //nc => nancyConfig
            //sc.WithNancyEndpoint(host, nc =>
            //{
            //    nc.AddHost(port: _config.LicenseServicePort);
            //    nc.CreateUrlReservationsOnInstall();
            //    nc.DeleteReservationsOnUnInstall();
            //    nc.OpenFirewallPortsOnInstall(firewallRuleName: "mycustomservice");
            //    nc.Bootstrapper = new Bootstrapper(_config);
            //});
        });

        host.SetDescription("Licensing service for my api.");
        host.SetDisplayName("myservice");
        host.SetServiceName("myservice);
        host.RunAsNetworkService();
        host.StartAutomatically();
    }

codetoshare 的已发布答案

private static void CreateHost(HostConfigurator host)
    {
        Log.Logger = SetupLogging();
        host.SetStartTimeout(TimeSpan.FromSeconds(60));
        //Plug serilog into host: log startup urls and start / stop
        host.UseSerilog(Log.Logger);

        //Allow to be run on linux as well
        host.UseLinuxIfAvailable();

        //sc => serviceconfigurator, ls => licenseService
        host.Service<WebService>(sc =>
        {
            //basic topshelf configuration
            sc.ConstructUsing(name => new WebService());
            sc.WhenStarted(ls => ls.Start());
            sc.WhenStopped(ls =>
            {
                ls.Stop();
                DisposeLogging();
            });
            //I am using an extension here because I had converted the application from Nancy.Host.Self to Nancy.Owin
            //if the extension will not get updated and this breaks the application, convert it to a normal app: see nearly every topshelf + owin example
            //owin configuration
            sc.OwinEndpoint(app =>
            {
                app.ConfigureHttp(configuration =>
                {
                    //use json.net serializer
                    configuration.Formatters.Clear();
                    configuration.Formatters.Add(new JsonMediaTypeFormatter());

                    //configure json settings
                    var jsonSettings = configuration.Formatters.JsonFormatter.SerializerSettings;
                    jsonSettings.Formatting = Formatting.Indented;
                    jsonSettings.Converters.Add(new StringEnumConverter { CamelCaseText = false, AllowIntegerValues = true });
                    jsonSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                });

                app.ConfigureAppBuilder(builder =>
                {
                    //setup windows authentication
                    HttpListener listener = (HttpListener)builder.Properties["System.Net.HttpListener"];
                    listener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication;

                    //setup nancy
                    builder.UseNancy(options =>
                    {
                        options.Bootstrapper = new Bootstrapper(_config);
                    });
                });
                //setup urls: always add localhost and 127.0.0.1 together with the host specified in the config file
                app.ConfigureStartOptions(options =>
                {
                    options.Port = _config.LicenseServicePort;
                    var localhost = $"http://localhost:{_config.LicenseServicePort}";
                    var localhost2 = $"http://127.0.0.1:{_config.LicenseServicePort}";
                    //todo: this should support https as well
                    //todo: allow multiple hosts to be specified on config
                    options.Urls.Add(localhost);
                    options.Urls.Add(localhost2);
                    var configuredHost = $"{_config.LicenseServiceUrl}:{_config.LicenseServicePort}";
                    if (!configuredHost.Equals(localhost) && !configuredHost.Equals(localhost2))
                    {
                        options.Urls.Add(configuredHost);
                    }
                });
            });

            //old nancyhost config, keep this untill documented on confluence
            //add host reservation during service install, this is the only time, nancy will have admin rights, will be deleted when service is uninstalled as well.
            //nc => nancyConfig
            //sc.WithNancyEndpoint(host, nc =>
            //{
            //    nc.AddHost(port: _config.LicenseServicePort);
            //    nc.CreateUrlReservationsOnInstall();
            //    nc.DeleteReservationsOnUnInstall();
            //    nc.OpenFirewallPortsOnInstall(firewallRuleName: "SegreyLicensingService");
            //    nc.Bootstrapper = new Bootstrapper(_config);
            //});
        });