一旦程序存在于 c# .net 核心中,端口就不会被释放
Port not freed as soon as program exist in c# .net core
我有一个用作 REST Web 服务器的 C# .net core 3.1 控制台应用程序。它作为 Windows 服务运行。它运行良好,但在我关闭应用程序(或它因某些操作而崩溃)后,我无法立即启动应用程序。我收到以下错误,
Unable to start Kestrel. System.IO.IOException: Failed to bind to address http://[::]:8000: address already in use.
---> Microsoft.AspNetCore.Connections.AddressInUseException: Only one usage of each socket address(protocol/network/address/port) is normally permitted.
--->System.Net.Sockets.SocketException(10048): Only one usage of each socket address(protocol/network/address/port) is normally permitted.
.
.
.
如果我在大约 5 分钟后尝试,我可以启动应用程序。在我进入应用程序之前,我应该做些什么或者我可以做些什么来释放端口上的绑定?
#更新 - 1
我使用以下命令在错误等情况下关闭应用程序,
_hostLifetime.StopApplication();
这是初始化网络服务器的代码,
webBuilder.UseStartup<Startup>().UseUrls(restPort.Value);
Startupclass的构造函数如下,
_httpListener = new HttpListener();
Startupclass中的Configure
方法有如下代码,
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
当您关闭 NetCore 应用程序时,它不会调用代码来终止 运行 服务。它只是终止,这意味着不会调用代码来关闭连接。您需要确保打开端口的任何代码都包含在 using
中,以便它可以正确处理。在 Windows 服务中,应该有一个 OnStop 方法,您需要处理该方法并显式关闭连接。
如果问题仍然存在,我发现解决它的唯一方法是重启我的机器
我有一个用作 REST Web 服务器的 C# .net core 3.1 控制台应用程序。它作为 Windows 服务运行。它运行良好,但在我关闭应用程序(或它因某些操作而崩溃)后,我无法立即启动应用程序。我收到以下错误,
Unable to start Kestrel. System.IO.IOException: Failed to bind to address http://[::]:8000: address already in use.
---> Microsoft.AspNetCore.Connections.AddressInUseException: Only one usage of each socket address(protocol/network/address/port) is normally permitted.
--->System.Net.Sockets.SocketException(10048): Only one usage of each socket address(protocol/network/address/port) is normally permitted.
.
.
.
如果我在大约 5 分钟后尝试,我可以启动应用程序。在我进入应用程序之前,我应该做些什么或者我可以做些什么来释放端口上的绑定?
#更新 - 1 我使用以下命令在错误等情况下关闭应用程序,
_hostLifetime.StopApplication();
这是初始化网络服务器的代码,
webBuilder.UseStartup<Startup>().UseUrls(restPort.Value);
Startupclass的构造函数如下,
_httpListener = new HttpListener();
Startupclass中的Configure
方法有如下代码,
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
当您关闭 NetCore 应用程序时,它不会调用代码来终止 运行 服务。它只是终止,这意味着不会调用代码来关闭连接。您需要确保打开端口的任何代码都包含在 using
中,以便它可以正确处理。在 Windows 服务中,应该有一个 OnStop 方法,您需要处理该方法并显式关闭连接。
如果问题仍然存在,我发现解决它的唯一方法是重启我的机器