Сколько потоков задействовано в обслуживании ASP.NET HTTP-запрос веб-API?

#c# #asp.net #.net #asp.net-mvc #asp.net-web-api

#c# #asp.net #.net #asp.net-mvc #asp.net-web-api

Вопрос:

Я подумал log Thread-ID о том, чтобы отслеживать запрос и сделать файл журнала доступным для чтения.

Итак, мои первоначальные попытки были logging in Global.asax такими:

 protected void Application_BeginRequest()
{
    log4net.ILog writer = log4net.LogManager.GetLogger(this.GetType());
    writer.InfoFormat("Gotta service a request. Id = {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
}

protected void Application_EndRequest()
{
    log4net.ILog writer = log4net.LogManager.GetLogger(this.GetType());
    writer.InfoFormat("Completed servicing a request. Id = {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
}
  

Но когда я вижу лог-файл, это очень странно.

 2014-06-16 20:27:06,018 -  Gotta service a request. Id = 286 --> From Application_BeginRequest()
2014-06-16 20:27:06,042 - Servicing Request Thread-Id = 286 --> this message comes from controller
2014-06-16 20:27:06,043 - Thread-Id = 286 --> this message comes from controller
2014-06-16 20:27:06,237 - Completed servicing a request. Id = 287 --> From Application_EndRequest()
  

В Application_Start , Thread-Id 286 но когда он возвращается к Application_EndRequest , Thread-Id changed to 287 .

Разве не один поток обслуживает весь HTTP request ?

Есть идеи, почему?

Комментарии:

1. Вероятно, он использует асинхронные операции

2. @Jonesy: хорошо, тогда есть идеи, как отследить запрос?

Ответ №1:

Запрос обрабатывается однопоточно, но это не означает, что это один и тот же поток на протяжении всего запроса.

Запрос может «перескакивать» потоки, вам по-прежнему гарантируется, что выполнение происходит по порядку, но вы не гарантированно выполняете один и тот же поток повсюду.

Комментарии:

1. Спасибо. Но тогда, How to track a request ?

2. HttpContext. Items[«id»] = new whateveryourridis() 🙂

3. @Yisahi Galatzer: Итак, в основном мы передаем содержимое unique id в контейнере cookie? Правильно?

4. нет, идея в том, что мы передаем его в пакете свойств, который перемещает потоки вместе с запросом