[英]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.