Мини-профайлер и SignalR

У меня есть веб-сайт ASP.NET MVC 4, который использует Mini Profiler. Совсем недавно я начал использовать SignalR для более интерактивных страниц.

У меня проблема со страницами SignalR, когда они открыты долгое время. Mini Profiler часто генерирует ошибку арифметического переполнения из-за большого количества времени, в течение которого запрос SignalR был открыт. Я понимаю, что Mini Profiler может игнорировать запросы SignalR MVC Mini Profiler Exception on MiniProfiler.Stop() .

Однако я все еще стремлюсь проанализировать производительность своих отдельных действий SignalR в запросе с помощью Mini Profiler. Есть какой-либо способ сделать это?


person Giles Roberts    schedule 28.04.2014    source источник
comment
Существуют ли определенные запросы SingalR, которые всегда остаются открытыми некоторое время, а некоторые нет? Или это может быть любой?   -  person Yaakov Ellis    schedule 29.04.2014
comment
@YaakovEllis Некоторые запросы SignalR недолговечны. Главный из них — постоянное соединение. Что мне было бы интересно, так это сбор данных о производительности подзапросов, которые происходят внутри основного постоянного соединения.   -  person Giles Roberts    schedule 29.04.2014


Ответы (1)


Способ запуска MiniProfiler по умолчанию — это вызов Start() в начале вашего запроса, который инициализирует экземпляр MiniProfiler для сбора ваших таймингов. Затем вызовите Stop() в конце запроса, который запишет ваши тайминги.

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

В этой модели ваши действия действительно более эквивалентны тому, что мы считаем обычными HTTP-запросами в веб-приложении. Таким образом, решение, которое может сработать для вас, будет состоять в том, чтобы запускать MiniProfiler.Start() в начале каждого из этих действий и MiniProfiler.Stop() в конце каждого из них, рассматривая каждое из них как отдельную сквозную единицу (и сохраняя информацию о профиле). всякий раз, когда вы звоните Stop()).

Start Main SignalR Connection

  SignalR Request Action1
    MiniProfiler.Start()
    Perform Action
    MiniProfiler.Stop()
  End SignalR Request Action1

  SignalR Request Action2
    MiniProfiler.Start()
    Perform Action
    MiniProfiler.Stop()
  End SignalR Request Action2

  ... Many More Actions ...

End Main SignalR Connection
person Yaakov Ellis    schedule 30.04.2014
comment
Спасибо за ответ. В моем случае вызов MiniProfiler.Stop() в действии концентратора SignalR, по-видимому, не сохраняет информацию о профиле. Обычно я сохраняю результаты MiniProfiler в своей базе данных для анализа. Действия концентратора SignalR не отображаются ни в пользовательском интерфейсе, что меня не удивляет и на самом деле меня не волнует, ни в базе данных. Является ли мой вопрос на самом деле другим вопросом, а именно, как заставить MiniProfiler записывать задачи, не связанные с пользовательским интерфейсом? - person Giles Roberts; 01.05.2014
comment
При дальнейшем расследовании кажется, что моя проблема заключается в том, что мой MiniProfiler.Current имеет значение null в классах концентратора SignalR, поэтому запуск и остановка не имеют никакого эффекта. Я просто пытаюсь настроить правильный контекст для этого. - person Giles Roberts; 10.06.2014