AcquireRequestState vs PreExecuteRequestHandler
В AcquireRequestState мы собрали довольно большое количество вызовов ajax, занимающих значительное количество времени, в наших путешествиях мы наткнулись на гем блокировки сеанса в ASP.Net, поэтому мы реализовали собственный обработчик состояния сеанса (на основе ссылки ниже).
После внесения изменения и его развертывания мы увидели очень резкое падение AcquireRequestState, но оно было заменено PreExecuteRequestHandler.
Этим утром меня внезапно осенило, что мы включили OWIN, что, вероятно, стало причиной того, что PreExecuteRequestHandler занял так много времени. Затем я приступил к его удалению, и в тот момент, когда я развернул код, PreExecuteRequestHandler исчез из списка. К сожалению, теперь его снова заменили на AcquireRequestState по той же цене.
Похоже, что нас сильно бьют по вызовам AJAX, которые возвращают частичные представления, вызовы AJAX, возвращающие примитивные типы, или объекты JSON, по-видимому, практически не подвержены влиянию, несмотря на более высокую пропускную способность.
Таким образом, у меня остаются 3 вопроса, на которые я совершенно не согласен, и я полагаю, что ответ на один из них приведет нас к ответу на другой 2.
1) Почему стоимость переместилась из AcquireRequestState в PreExecuteEventHandler, когда был установлен OWIN? Что-то на OWIN помечено как IRequireSessionState? (Насколько я понимаю, AcquireRequestState должен был произойти раньше в управляемом конвейере)
2) Как мы можем получить больше информации о том, что на самом деле происходит внутри этого AcquireRequestState? Или лучше потратить время на возвращение объекта JSON и его использование для визуализации того, что нам требуется в пользовательском интерфейсе?
3) Мы видим пару запросов (хотя и очень мало), которые отображаются в /{controller}/{action}/{id} в New Relic, а затем полностью застревают на время запроса в вышеупомянутом. Это несмотря на то, что мы установили ограничения на нашу маршрутизацию только для маршрутизации на контроллеры и действия, которые мы имеем в проекте.
PS: Это выглядит очень похоже на следующее, мы также видим это в New Relic: длительные задержки в AcquireRequestState
Custom Session Module from: Я только что обнаружил, почему все сайты ASP.Net работают медленно, и я пытаюсь понять, что с этим делать.
2 ответа
Для тех, кто пытается исключить проблему сеанса, с которой мы в конечном итоге столкнулись, но кому все еще нужно полагаться на значения сеанса (так что вы не можете просто отключить сеанс на уровне контроллера), посмотрите на следующего поставщика состояния сеанса:
https://github.com/aspnet/AspNetSessionState
В частности, убедитесь, что вы обратили внимание на следующие настройки приложения:
<add key="aspnet:AllowConcurrentRequestsPerSession" value="[bool]"/>
Вам нужно будет обновить до.Net Framework 4.6.2, но в нашем случае это небольшая цена.
Я понимаю задержки состояния получения - поставщик сеанса по умолчанию разрешает один запрос для каждого пользователя за раз, он сохраняет блокировку сеанса до тех пор, пока запрос не будет обработан. Есть несколько способов решить эту проблему, но я понимаю, что все это сделано. Интересно, были ли у кого-нибудь ответы на вопросы 1, 2 и 3.