Что такое одиночный HTTP-запрос? - PullRequest
0 голосов
/ 05 августа 2020

Я работаю над ядром asp. net и наткнулся на такие концепции, как AddTransient, AddSingleton и AddScoped. Они различаются жизненным циклом объекта.

1. Singleton , который создает один экземпляр во всем приложении. Он создает экземпляр впервые и повторно использует один и тот же объект во всех вызовах.

Scoped службы времени жизни создаются один раз для каждого запроса в рамках. Это эквивалент синглтона в текущей области. Например, в MVC он создает один экземпляр для каждого HTTP-запроса, но он использует тот же экземпляр в других вызовах в рамках одного и того же веб-запроса. Transient Life Services создаются каждый раз они запрашиваются. Это время жизни лучше всего подходит для облегченных служб без сохранения состояния.

Я хотел бы знать, в чем смысл одного HTTP-запроса? Если я перенаправляю на другую страницу, означает ли это, что это еще один HTTP-запрос? PS Я использовал приведенные выше определения из Различия служб AddTransient, AddScoped и AddSingleton

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Scoped Lifetime означает одно HTTP-соединение с сервером.

После отправки ответа и закрытия соединения объекты, зарегистрированные как Scoped, удаляются.

Таким образом, перенаправление - это два запроса; один для HTTP 302 перенаправления и один для целевой страницы. Вам, вероятно, нужно беспокоиться об этом только в том случае, если вы на самом деле внедряете службу во все, что выполняет перенаправление.

В этом ответе обсуждаются альтернативы перенаправлению , которые будут работать со службами Scoped.

Также обратите внимание на эту часть ASP. NET Документация . Этот тривиальный код показывает, как работает время существования Scoped.

ScopedService.cs

public class ScopedGuidService
{
   public Guid ScopedGuid => Guid.NewGuid();
}

Startup.cs

public class Startup
{
   public void ConfigureServices(IServiceCollection services)
   {
       services.AddScoped<ScopedGuidService>();
   }
   
   public void Configure(IApplicationBuilder app)
   {
     // Middleware showing how Scoped / per request works
     app.Use((context, next) =>
     {
        var scopedGuidService = 
        context.RequestServices.GetRequiredService<ScopedGuidService>();
        return context.Response.WriteAsync(scopedGuidService.ScopedGuid.ToString());
    });
}

Если вы запустите его, вы получите другой Guid для каждый запрос.

1 голос
/ 05 августа 2020

Scoped - это время жизни, которое сложно понять. Начнем с того, почему он называется Scoped, а не PerRequest et c?

Причина в том, что контейнер DI не имеет понятия «запросы». Но у него есть «прицелы». Когда ваше приложение запускается, оно создает набор сервисов «root». Теперь, когда ваше приложение получает HTTP-запрос, из этой коллекции служб root создается область действия. Все услуги, которые вы приобретаете в контроллерах et c. приобретаются из этой области. Если служба определена как временная или ограниченная, область создаст их и удалит их, когда область будет удалена, то есть когда HTTP-запрос завершится. Однако, если это синглтон, область получает единственный экземпляр из коллекции служб root.

Разница между переходным процессом и областью действия заключается в том, что если одна и та же служба запрашивается во время одного и того же запроса, один и тот же экземпляр для служба с заданной областью действия возвращается, в то время как переходные процессы всегда будут новыми экземплярами.

Теперь по вашему вопросу: что происходит, когда вы перенаправляете пользователя?

  1. Ваше приложение получает запрос
  2. Он возвращает код состояния 302 Found для перенаправления вызывающего абонента, на этом заканчивается запрос
  3. Пользователь делает новый запрос на URL-адрес, указанный в заголовке Location в ответе на предыдущий запрос

Значит, это новый запрос.

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