У меня есть очень простое приложение состоящее из двух классов:
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMvc(options => options.EnableEndpointRouting = false);
var app = builder.Build();
app.UseWebSockets();
app.UseMvc();
app.Run();
}
}
[Route("/ws")]
public class WsController : Controller
{
private readonly ILogger _logger;
public WsController(ILogger<WsController> logger)
{
_logger = logger;
}
public async Task<IActionResult> IndexAsync()
{
_logger.LogInformation($"Start WS; remote ip: {HttpContext.Connection.RemoteIpAddress}");
if (HttpContext.WebSockets.IsWebSocketRequest)
{
using (WebSocket remoteHost = await HttpContext.WebSockets.AcceptWebSocketAsync())
{
remoteHost.Abort();
_logger.LogInformation($"Execute WS; remote ip: {HttpContext.Connection.RemoteIpAddress}");
}
}
return new EmptyResult();
}
}
Как видно, этот код занимается тем, что принимает запросы и сразу их сбрасывает. В приложение постоянно приходят запросы на подключение по WebSocket, некоторые из которых могут нести произвольные данные.
Я запускаю приложение в IIS, в модели выполнения Out of process, версия фреймворка: net7. В процессе w3wp.exe который связан с этим приложением постепенно утекает память, и ее потребление ни как не ограничивается, она может за день так занять гигабайт.
Если не принимать запросы с помощью AcceptWebSocketAsync(), то утечки не происходит. Фактически после вызова этой функции я произвожу очистку связанных ресурсов, но почему тогда после окончания обработки запроса IIS все равно хранит по видимому какие-то данные связанные с этим запросом?
Я уже довольно долго сижу над этой проблемой, поэтому если у вас есть какие-то любые предположения или нужно что-то уточнить, пишите я постараюсь быстро ответить