Приложение ASP. NET MVC 4.0 время от времени зависает в нашей производственной среде. Пытаясь проанализировать проблему с помощью Windbg (+ SOS, SOSEX, NETEXT & MEX) и двух дампов памяти производственного процесса, я заметил, что проблема всегда возникает, когда два запроса обрабатываются одновременно (выполняется бизнес-код. NET) для ОДНОЙ сессии. Насколько я понял, это невозможно без настройки поведения сеанса (с помощью конфигурации, атрибутов или ControllerFactory). В этом приложении используются (закончились) сеансы, и поведение сеанса не было настроено. Единственная настройка, которую я могу найти (контроллеры / код / конфигурация), - это в web.config:
<sessionState timeout="720" />
Вот результаты моего сеанса windbg, если кто-то может помочь мне разобраться в этом случае.
! Whttp
HttpContext Thread Time Out Running Status Verb Url
0000002d0c7754b0 26 00:01:50 00:36:55 200 POST /Ctrl/Action
0000002e06a2e7e8 27 00:01:50 00:41:45 200 POST /Ctrl/Action
[...]
Это два HTTP-запроса, которые занимают вечность.
! DumpAspNetSession -ctx 0000002d0c7754b0
System.Web.SessionState.HttpSessionStateContainer: 0x0000002d0c7a9a38
Key Value
================================ ======================================================
VarSession 0000002e06587000 (App.VarSession)
! DumpAspNetSession -ctx 0000002e06a14e7e8 * 10 *
System.Web.SessionState.HttpSessionStateContainer: 0x0000002e06a3a810
Key Value
================================ ======================================================
VarSession 0000002e06587000 (App.VarSession)
Сеансы, соответствующие HttpContext выше, содержат одни и те же данные (тип App.VarSession).
! Wcook ie
0000002d0c7754b0 /Ctrl/Action (200 NULL) Running (00:36:55)
======================================================================================
ASP.NET_SessionId=im3clvnd0auw0te3nkzzq1p0
======================================================================================
0000002e06a2e7e8 /Ctrl/Action (200 NULL) Running (00:41:45)
======================================================================================
ASP.NET_SessionId=im3clvnd0auw0te3nkzzq1p0
Эта последняя команда показывает два запросы действительно относятся к одному и тому же сеансу.
~ 26s
0: 026>! CLRStack
OS Thread Id: 0x122c (26)
Child SP IP Call Site
0000002f2de47750 00007ff91a2042db System.Linq.Enumerable+d__14`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].MoveNext()
0000002f2de477b0 00007ff91a2095b7 System.Linq.Enumerable.FirstOrDefault[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerable`1, System.Func`2)
0000002f2de47810 00007ff8be3ce1fe App.DALApp.GetData(...)
~ 27s
0: 027> ! CLRStack
OS Thread Id: 0x313c (27)
Child SP IP Call Site
0000002f2f976f20 00007ff8be5022ef App.DALApp.b__257(...)
0000002f2f976f60 00007ff91a2042ab System.Linq.Enumerable+d__14`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].MoveNext()
0000002f2f976fc0 00007ff91a2095b7 System.Linq.Enumerable.FirstOrDefault[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerable`1, System.Func`2)
0000002f2f977020 00007ff8be501038 App.DALApp.GetSomeData(...)
Оба запроса выполняют собственный код (фактически, они используют 100% ЦП и никогда не заканчиваются ...)
Возможен ли этот случай? Если да, то при каких условиях и что я неправильно понял в отношении поведения блокировки состояния сеанса? (https://docs.microsoft.com/en-us/dotnet/api/system.web.sessionstate.sessionstatebehavior?view=netframework-4.0) Может ли это странное поведение быть причиной зависания приложения?
Спасибо.
РЕДАКТИРОВАТЬ: Прочитав некоторые ASP. NET Код, я сбросил два HttpContext, и он подтверждает странное поведение (два запроса с требуемым поведением состояния сеанса и тем же сеансом сразу). Я что-то неправильно понял? Я не могу поверить, что такая ошибка могла существовать без ведома кого-либо (я не могу найти подобную проблему в Интернете):
! Wdo 0000002E06A2E7E8
Address: 0000002e06a2e7e8
Method Table/Token: 00007ff919304a98/20003a304
Class Name: System.Web.HttpContext
...
00007ff919346278 System.Web.SessionState.SessionStateBeha +0164 _SessionStateBehavior_k__BackingField 0 (0n0) Default
00007ff91bb9f370 System.Boolean +0175 _requiresSessionStateFromHandler 1 (True)
00007ff91bb9f370 System.Boolean +0176 _readOnlySessionStateFromHandler 0 (False)
00007ff91bb9f370 System.Boolean +0177 InAspCompatMode 0 (False)
00007ff91bb9f370 System.Boolean +0179 _FirstRequest_k__BackingField 0 (False)
00007ff91bbb7af8 System.DateTime +0180 _utcTimestamp -mt 00007FF91BBB7AF8 0000002E06A2E970 28/02/2020 08:16:37
! Wdo 0000002D0C7754B0
Address: 0000002d0c7754b0
Method Table/Token: 00007ff919304a98/20003a304
Class Name: System.Web.HttpContext
...
00007ff919346278 System.Web.SessionState.SessionStateBeha +0164 _SessionStateBehavior_k__BackingField 0 (0n0) Default
00007ff91bb9f370 System.Boolean +0175 _requiresSessionStateFromHandler 1 (True)
00007ff91bb9f370 System.Boolean +0176 _readOnlySessionStateFromHandler 0 (False)
00007ff91bb9f370 System.Boolean +0177 InAspCompatMode 0 (False)
00007ff91bb9f370 System.Boolean +0179 _FirstRequest_k__BackingField 0 (False)
00007ff91bbb7af8 System.DateTime +0180 _utcTimestamp -mt 00007FF91BBB7AF8 0000002D0C775638 28/02/2020 08:21:27
РЕДАКТИРОВАТЬ 2: Также задавался вопрос на ASP. NET MVC форумах: https://forums.asp.net/t/2169038.aspx?Multiple+concurrent+ASP+NET+MVC+4+requests+for+same+session+possible+without+specific+setting+