代码之家  ›  专栏  ›  技术社区  ›  Hairydruidy

南希。欧文vs南希。群众或部队的集合。带topshelf的Self

  •  0
  • Hairydruidy  · 技术社区  · 7 年前

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

    我有一个利用南希的项目。群众或部队的集合。Self和没有找到任何关于如何设置windows身份验证的文章,而我确实为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();
        }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Hairydruidy    6 年前

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