Nancy.Owin vs Nancy.Hosting.Self with topshelf

时间:2018-01-20 17:50:07

标签: owin nancy topshelf

1)设置两个不同的包装有什么区别?是否比另一个更受支持?

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

以下是一些不同的问题。

2)jsonformatter可以在nancy bootstrapper中配置,就像在owin端点topshelf中一样。 我应该在哪里配置格式化程序?如果在topshelf owin端点中配置,那么它也会应用在nancy bootstrapper中吗?

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

1 个答案:

答案 0 :(得分:0)

发布代码共享答案

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