简体   繁体   English

多个网络服务器重启问题 Asp.Net Kestrel

[英]Multiple webservers restart issue Asp.Net Kestrel

I am a beginner in Asp.Net, i am having a weird issue regarding restarting of webserver.我是 Asp.Net 的初学者,我在重启网络服务器时遇到了一个奇怪的问题。

i have an application and i am trying to start two webservers one after another.我有一个应用程序,我正在尝试一个接一个地启动两个网络服务器。

The client class instatntiates two usecases and usecase start the webserver.客户端 class 实例化两个用例,用例启动网络服务器。

Code Example:代码示例:

class Client
{
  void Start()
  {
    var usecase1  = new Usecase.StartAsync();
    var usecase2 = new Usecase.StartAsync();
  }

  void ReStart()
  {
    usecase1.ReStartAsync();
    usecase2.ReStartAsync();
  }
}

class Usecase
{
   async Task StartAsync()
   {
     await Server.RunAsync();
   }

   async Task StopAsync()
   {
     await Server.StopAsync();
   }

   async Task ReStartAsync()
   {
     await  StopAsync();
     await StartAsync();
   }
}

class Server
{
        /// <summary>
        ///     start the webserver
        /// </summary>
        public async Task RunAsync()
        {
            try
            {
                var webHostBuilder = WebHost.CreateDefaultBuilder();


                if(_useHttp)
                  ConfigureHttpwebServer(webhostBuilder)
                else
                  ConfigureHttpswebServer(webHostBuilder)

                webHostBuilder.UseStartup<Startup<TSchema>>();
                _webHost = webHostBuilder.Build();
                Console.WriteLine("webserver running on urls: {0}", webHostBuilder.GetSetting(WebHostDefaults.ServerUrlsKey));
                Log.InfoFormat("webserver running on urls: {0}", webHostBuilder.GetSetting(WebHostDefaults.ServerUrlsKey));
                
                await _webHost.RunAsync().ConfigureAwait(false);
                Log.InfoFormat("WebServer Termintated...");
            }
            catch (Exception ex)
            {
                Log.ErrorFormat("WebServer cannot start because {0}", ex.Message);
            }
        }

        public async Task StopAsync()
        {
            try
            {
                if (_webHost != null)
                {
                    await _webHost.StopAsync().ConfigureAwait(false);
            
                    Log.Info("Webserver Stopped.");
                }
            }
            catch (Exception e)
            {
                Log.ErrorFormat("Cannot stop webserver due to {0}", e.Message);
            }
            finally
            {
                _webHost?.TryDispose();
                Log.Info("WebHost disposed.");
                _webHost = null;
            }
        }

        private bool ConfigureWebServer(IWebHostBuilder webHostBuilder)
        {
            webHostBuilder.UseUrls($"http://localhost:{_port}", $"http://{Environment.MachineName}:{_port}");
            return true;
        }

   private bool ConfigureHttpsWebServer(IWebHostBuilder webHostBuilder)
        {
            var thumbPrint = _webServerConfiguration.Thumbprint;
            if (string.IsNullOrWhiteSpace(thumbPrint))
            {
                Log.ErrorFormat("Cannot find the certificate due to missing thumbprint information.");
                return false;
            }
            
            X509Certificate2 certificate = FindCertificate(thumbPrint);
            
            var certificateStatus = GetCertificateStatus(certificate);
            if (certificateStatus != CertificateStatus.Found)
            {
                Log.ErrorFormat( certificateStatus.Description());
                return false;
            }

            webHostBuilder.ConfigureKestrel(options =>
            {
                options.ListenAnyIP((int)_port, listenOptions => { listenOptions.UseHttps(certificate);});
            });

            return true;
        }
}

The problem is when I start from client class I can access both usecases urls in browser, but when i restart and want to switch to Https protocol then only the usecase2 url for Https works. The problem is when I start from client class I can access both usecases urls in browser, but when i restart and want to switch to Https protocol then only the usecase2 url for Https works.

When i try to access usecase1 url it gives an error "localhost cannot handle requests" Error 500.当我尝试访问 usecase1 url 时出现错误“本地主机无法处理请求”错误 500。

This only happens when i switch from Http to Https or Https to Http.这只发生在我从 Http 切换到 Https 或 Https 到 Z9D4D43DE68F0B3955D5A5EF5ZDC0 时。

Also i get no error, both the webservers run without exception.我也没有收到任何错误,两个网络服务器都毫无例外地运行。

Please help.请帮忙。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM