Самостоятельно размещаемое приложение asp.net просачивается на респаун веб-хостинга - PullRequest
0 голосов
/ 22 января 2019

У меня есть само размещаемое основное приложение asp.net, которое иногда вызывает его WebHost в новом контексте. Приложение регистрирует общий ресурс в виде одиночного файла в контейнере asp.net DI.

            services.AddSingleton<MyDep>();

Контроллер зависит от ресурса общего ресурса:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    public MyDep Dep { get; }

    public ValuesController(MyDep dep)
    {
        Dep = dep;
    }

    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] {
            new string(Dep.Content),
            "value2" };
    }
 }

Утечка ресурсов, связанных с предыдущим экземпляром. Я воспроизвел проблему, используя демонстрационное приложение (слегка измененный шаблон проекта ядра app asp.net).

public static void Main(string[] args)
    {
        var p = new Program();
        while (true)
        {
            p.Boot(args);
            GC.Collect(2, GCCollectionMode.Forced, true);
        }
    }

    private void Boot(string[] args)
    {
        webHost = CreateWebHostBuilder(args).Build();
        webHost.RunAsync();
        Thread.Sleep(5000);
        webHost.StopAsync().Wait();
        webHost.Dispose();
    }

Я вижу n экземпляров контроллера, где n - это число http-запросов к контроллеру - контроллер вообще не удаляется. Профилировщик указывает длинный путь к корню с System.Threading.OverlappedData в конце цепочки. Не могли бы вы подсказать, что не так с этой настройкой? пример приложения

путь к корню

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Хорошо, я показал неправильный след для описанной проблемы.Тем не менее контекст не был должным образом освобожден.

Я нашел решение: IApplicationLifecycle.StopApplication, как описано здесь -> https://www.blakepell.com/asp-net-core-ability-to-restart-your-site-programatically-updated-for-2-0

Контекст освобождается должным образом, и объем памяти больше не увеличивается бесконечно.

0 голосов
/ 22 января 2019

Я вижу n экземпляров контроллера, где n - это количество http-запросов к контроллеру

Это ожидаемое поведение.Контроллеры создаются для каждого запроса по умолчанию.

С ваш снимок Я не вижу, есть несколько экземпляров MyDep.На снимке показаны экземпляры Func<ValueController, MyDep>, что не является ожидаемым.Если вы вызовете делегата, вы получите один и тот же экземпляр MyDep среди разных запросов.Вообще говоря, в этом нет ничего плохого.Вы отслеживаете неправильный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...