justeat / Topshelf.Nancy

Nancy endpoint for the Topshelf service host providing additional support around URL reservations. — Edit
Other
65 stars 30 forks source link

The new release of Topshelf 4.0.0 via nuget just broke the Topshelf.Nancy Nuget Package #20

Closed StewartScottRogers closed 2 years ago

StewartScottRogers commented 8 years ago

The new release of Topshelf 4.0.0 via nuget just broke the Topshelf.Nancy Nuget Package.

I noticed there is no activity on this project in some time... IF I update Topshelf I get the errors below. If I roll it back everything is fine... The only variable is the Topshelf 4.0.0 Nuget Update.


Error from Visual Studio 2015

Severity Code Description Project File Line Suppression State

Error CS0012 The type 'ServiceConfigurator<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'Topshelf, Version=3.2.150.0, Culture=neutral, PublicKeyToken=b800c4cfcdeea87b'. Console H:\Tfs\ArchivingService\Console\Program.cs 40 Active

Line 40

serviceFactoryBuilder.WithNancyEndpoint(hostConfiguration, nancyConfigurator => { .....

Complete class

using System; using System.IO; using ApplicationService; using ApplicationService.Libraries; using Global.NetworkCryptography; using Topshelf; using Topshelf.Nancy;

public static class Program { public static void Main() { Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); var loggingManager = new LoggingManager(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    loggingManager.TraceAndTrapExceptions(() => {
        loggingManager.Log.Debug(() => "Beggin: " + ConfigurationManagement.DisplayDescription);

        HostFactory.Run(hostConfiguration => {

            hostConfiguration.BeforeInstall(() => {
                X509Certificate2Manager.EnsureDefaultServerCertificatesAreInstalled(ApplicationInformation.Product);

                foreach (var serverX509CertificatesForMicroService in X509Certificate2Manager.SelectServerX509CertificatesForMicroServices(ApplicationInformation.Product)) {
                    if (serverX509CertificatesForMicroService.TryNetshDelete(ConfigurationManagement.GetLocalhostDomainPortNumber()))
                        serverX509CertificatesForMicroService.NetshAdd(ConfigurationManagement.GetLocalhostDomainPortNumber());

                    if (serverX509CertificatesForMicroService.TryNetshDelete(ConfigurationManagement.GetMachineDomainPortNumber()))
                        serverX509CertificatesForMicroService.NetshAdd(ConfigurationManagement.GetMachineDomainPortNumber());
                }
            });

            hostConfiguration.AfterUninstall(() => {
                foreach (var serverX509CertificatesForMicroService in X509Certificate2Manager.SelectServerX509CertificatesForMicroServices(ApplicationInformation.Product)) {
                    serverX509CertificatesForMicroService.TryNetshDelete(ConfigurationManagement.GetLocalhostDomainPortNumber());
                    serverX509CertificatesForMicroService.TryNetshDelete(ConfigurationManagement.GetMachineDomainPortNumber());
                }
            });

            hostConfiguration.Service<NancySelfHost>(serviceFactoryBuilder => {

                serviceFactoryBuilder.WithNancyEndpoint(hostConfiguration, nancyConfigurator => {

                    nancyConfigurator.ConfigureNancy(nancyHostConfigurator => {
                        nancyHostConfigurator.RewriteLocalhost = false;   // Lets you run at other than admin rights then you can ignore "Run As Administrator".
                        loggingManager.Log.Info(() => $"RewriteLocalhost: {nancyHostConfigurator.RewriteLocalhost}");

                        nancyHostConfigurator.UnhandledExceptionCallback = exception => loggingManager.Log.Error(() => new LoggingRequest("NancySelfHost.hostConfiguration.UnhandledExceptionCallback.", exception));

                        nancyHostConfigurator.EnableClientCertificates = ConfigurationManagement.GetEnableClientCertificates();
                        loggingManager.Log.Info(() => $"EnableClientCertificates: {nancyHostConfigurator.EnableClientCertificates}");

                        nancyHostConfigurator.AllowChunkedEncoding = false;
                        loggingManager.Log.Info(() => $"AllowChunkedEncoding: {nancyHostConfigurator.AllowChunkedEncoding}");

                        nancyHostConfigurator.AllowAuthorityFallback = false;
                        loggingManager.Log.Info(() => $"AllowAuthorityFallback: {nancyHostConfigurator.AllowAuthorityFallback}");

                        nancyHostConfigurator.UrlReservations.CreateAutomatically = true;
                        loggingManager.Log.Info(() => $"UrlReservations.CreateAutomatically: {nancyHostConfigurator.UrlReservations.CreateAutomatically}");
                        loggingManager.Log.Info(() => $"UrlReservations.User: {nancyHostConfigurator.UrlReservations.User}");
                    });

                    var scheme = "http";
                    if (ConfigurationManagement.GetEnableServerCertificates())
                        scheme = "https";

                    nancyConfigurator.AddHost(scheme: scheme, domain: ConfigurationManagement.GetLocalhostDomainName(), port: ConfigurationManagement.GetLocalhostDomainPortNumber());
                    loggingManager.Log.Info(() => $"Host => scheme: {scheme}, domain: {ConfigurationManagement.GetLocalhostDomainName()}, port: {ConfigurationManagement.GetLocalhostDomainPortNumber()}");

                    nancyConfigurator.AddHost(scheme: scheme, domain: ConfigurationManagement.GetMachineDomainName(), port: ConfigurationManagement.GetMachineDomainPortNumber());
                    loggingManager.Log.Info(() => $"Host => scheme: {scheme}, domain: {ConfigurationManagement.GetMachineDomainName()}, port: {ConfigurationManagement.GetMachineDomainPortNumber()}");

                    nancyConfigurator.DeleteReservationsOnUnInstall();
                    nancyConfigurator.CreateUrlReservationsOnInstall();
                    nancyConfigurator.OpenFirewallPortsOnInstall(firewallRuleName: $"{ConfigurationManagement.ApplicationName}:{ConfigurationManagement.InstanceName}.FirewallRule");
                    loggingManager.Log.Info(() => $"ShouldOpenFirewallPorts '{nancyConfigurator.ShouldOpenFirewallPorts}', FirewallRuleName: '{nancyConfigurator.FirewallRuleName}'");
                });

                serviceFactoryBuilder.ConstructUsing(hostSettings => new NancySelfHost());

                serviceFactoryBuilder.AfterStartingService(hostStartContext => { });
                serviceFactoryBuilder.BeforeStoppingService(hostStartContext => { });
                serviceFactoryBuilder.WhenStarted(nancySelfHost => nancySelfHost.Start());
                serviceFactoryBuilder.WhenStopped(nancySelfHost => { nancySelfHost.Stop(); });
                serviceFactoryBuilder.WhenPaused(nancySelfHost => nancySelfHost.Pause());
                serviceFactoryBuilder.WhenContinued(nancySelfHost => nancySelfHost.Continue());
                serviceFactoryBuilder.WhenShutdown(nancySelfHost => { nancySelfHost.Shutdown(); });
                serviceFactoryBuilder.BeforeStartingService(hostStartContext => { hostStartContext.RequestAdditionalTime(TimeSpan.FromSeconds(120)); });
                serviceFactoryBuilder.AfterStoppingService(hostStartContext => { });
            });

            hostConfiguration.SetServiceName(ConfigurationManagement.ApplicationName);
            hostConfiguration.SetInstanceName(ConfigurationManagement.InstanceName);
            hostConfiguration.SetDisplayName(ConfigurationManagement.DisplayName);
            hostConfiguration.SetDescription(ConfigurationManagement.DisplayDescription);

            hostConfiguration.RunAsNetworkService();
            hostConfiguration.StartAutomatically();

            hostConfiguration.EnablePauseAndContinue();
            hostConfiguration.EnableShutdown();

            hostConfiguration.EnableServiceRecovery(serviceRecovers => {
                serviceRecovers.OnCrashOnly();
                serviceRecovers.SetResetPeriod(2);
                serviceRecovers.RestartService(3);
                //serviceRecovers.RestartComputer(5, $"Restarting the server '{Environment.MachineName}' because '{ConfigurationManagement.ApplicationName}' has scheduled  a restart due to multiple failures starting the windows service.");
            });
        });
        loggingManager.Log.Debug(() => "Ending: " + ConfigurationManagement.DisplayDescription);
    });
}

}

AnthonySteele commented 8 years ago

Topshelf 4 only came out 2 days ago, it's still brand new.

We'll have to rebuild TopShelf.Nancy with Topshelf 4.0.0 at minimum. There may be things changed as well in Topshelf that require corresponding changes.

I might have time to look at it soon as we probably will also want to get this update soon.

AnthonySteele commented 8 years ago

I have made a PR here: https://github.com/justeat/Topshelf.Nancy/pull/21