Почему мое новое приложение .Net 4.0 EF блокируется случайным образом? - PullRequest
2 голосов
/ 27 февраля 2011

Я недавно выпустил новое приложение ASP .Net. Это приложение использует .Net 4.0 и Entity Framework 4. Это «базовое» приложение CRUD. Я почти исключительно использовал EntityDataSource для доступа к данным.

Пользователи сообщают о «временном зависании» приложения (все они используют IE 8). Если пользователь закрывает свой браузер и запускает резервную копию, приложение в порядке. Это может случиться один или два раза в день, обычно для активных пользователей. (Итак, я склонялся к утечке памяти или к каким-либо другим ограничениям ресурсов.)

Еще совсем недавно я никогда не видел, чтобы это случилось. Он не оставляет ничего в журнале событий на клиентском ПК или сервере. Кроме того, в журналах ошибок IIS или журналах SQL ничего нет.

Некоторое время назад я наконец-то понял, что это произошло. Я переключал все мои EntityDataSources, чтобы использовать один объектный контекст на страницу. Я скачал EF Profiler (который, кажется, отличный продукт) и указал, что я использую несколько контекстов объектов на многих моих страницах, из-за того, что многие из них имеют более одного EntityDataSource. Итак, я все это вычищал и тестировал каждую страницу, когда о чудо ... IE перестал загружать страницы!

Сначала страница начала медленно загружаться (и это была страница, которую я уже изменил, чтобы использовать один объектный контекст, так что, хотя я все еще считаю, что мне нужно реализовать этот шаблон синглтона на всех моих страницах, я думаю, это не преступник! Во всяком случае ..), то в какой-то момент я получил:

Сообщение: Sys.WebForms.PageRequestManagerTimeoutException: истекло время ожидания запроса к серверу.

Тем не менее, ничего в журнале событий. Я также проверил веб-журналы IIS и ничего не вижу, но их довольно сложно читать невооруженным глазом, возможно, мне придется скачать парсер, чтобы убедиться, что там ничего нет.

В любом случае, я решил запустить другое окно и перейти к своему приложению, и, конечно же, это окно работало нормально, никаких проблем. Я вернулся к окнам, которые перестали отвечать, обновил его, подождал ... пошел на домашнюю страницу моего приложения (которая в основном представляет собой просто статический html ... и ничего ...). Затем я открыл новую вкладку в окне, которое в данный момент заморожено, и эта вкладка работает нормально. Итак, я возвращаюсь к окну, которое больше не может загружать страницы из моего приложения, и пробую некоторые другие веб-сайты .... espn.com загружается нормально, msn.com загружается нормально, затем я ввожу URL для домашней страницы моего приложения ( и попробовал некоторые другие страницы в моем приложении) и ничего. IIS даже не регистрирует попытки в своих лог-файлах (как будто IE просто решил больше не «получать» для моего локального хоста!). Наконец, после некоторого ожидания (пока я печатал этот пост) у меня теперь есть это сообщение об ошибке в этом окне:

Internet Explorer не может отобразить веб-страницу. Что вы можете попробовать: Проблема может быть вызвана множеством проблем, в том числе: BLAH BLAH BLAH ...

Итак, я возвращаюсь к этому окну, и оно все еще может нормально просматривать интернет-сайты. Но, еще раз, когда я пытаюсь перейти на любую из страниц в моем приложении, я ничего не получаю (вращая синий кружок во вкладке). Итак, я снова открываю новую вкладку в том же браузере и могу нормально просматривать приложение.

Что мое приложение сделало с этим экземпляром браузера, который больше не позволяет ему загружать какие-либо из его страниц (на самом деле, кажется, что он даже не выполняет GET ни на одной из страниц приложений, поскольку в нем нет ничего нового в журналах IIS ... за исключением случаев, когда я загружаю страницы в этих других вкладках и / или окнах браузера, которые работают нормально, поэтому ведение журнала все еще работает ...)? Я буду всегда в долгу перед человеком, который может помочь мне понять это. Я не уверен, что это принесет много пользы, но я собираюсь оставить это окно браузера в надежде, что кто-то может сказать мне некоторые вещи, чтобы попытаться диагностировать эту проблему. Такое ощущение, что я НАСТОЯЩИМ, чтобы понять это. У меня наконец есть окно, которое плохо себя ведет. Я боюсь закрыть окно или сделать новую сборку в приложении, пока не получу хороший вклад в то, что нужно попробовать ...

Я должен добавить, что когда это случилось со мной, я работал на своем локальном ПК, поэтому я был единственным пользователем и имел только одно окно, открытое для приложения ..

Хотя, я совершенно тупой!

Ответы [ 5 ]

2 голосов
/ 17 июня 2011

У нас была та же проблема, и мы, казалось, решили ее, добавив следующий код JavaScript на все страницы с помощью ajax:

window.onunload = abortRequest;
function abortRequest() {
   Sys.WebForms.PageRequestManager.getInstance().abortPostBack();
} 

Надеюсь, это поможет!

1 голос
/ 27 февраля 2011

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

Шаг 1 - Видимость среды

Настройте себя таквы можете примерно увидеть внутри ваших систем.Настройте системный монитор и добавьте несколько важных счетчиков (текущие запросы IIS, текущие запросы ASP.NET, SQL Server - активные транзакции).Идея использования счетчиков «активных запросов / транзакций» заключается в том, что вы хотите выяснить, какая часть системы удерживает запрос.

Кроме того, добавьте счетчики для общего времени запроса в IIS и БД (так что вы можете видеть, как он поднимается, как будто что-то висит).

На клиентском ПК настройте Fiddler.

Шаг 2 - Воспроизвести выпуск

Обычно в этот момент приложение понимает, что вы можете его видеть, и начинает вести себя отлично.;) Остановитесь и убедитесь, что вы все еще можете воспроизвести проблему.

Шаг 3 - Извлеките БД из уравнения

Создайте в своем приложении 4 страницы:

  1. Статический HTML-файл (.htm), который НЕ будет проходить через движок ASP.NET.Это ваша базовая линия для необработанного IIS.
  2. Страница ASPX без уловок (без доступа к базе данных, без обработки, просто простая страница, которую ASP.NET может выплюнуть)
  3. Страница ASPX с одним простымвызов базы данных (некоторого размера, возможно, выполнить один большой запрос или что-то в этом роде)
  4. ASPX-страница с некоторыми сложными транзакциями (несколько запросов и т. д.)

Шаг 4 - Воспроизвестии измерить

Поскольку эта проблема, вероятно, станет достаточно очевидной, как только вы ее увидите, найдите узкое место с вашими счетчиками производительности и Fiddler.Ваша проблема звучит так, как будто у вас может быть периодически возникающая проблема с подключением (между клиентом и веб-сервером или веб-сервером / SQL), особенно если IE выдает ошибку «страница не может быть отображена», но вы должны увидеть это в Fiddler.На стороне сервера вы должны увидеть один из этих счетчиков производительности.

1 голос
/ 27 февраля 2011

звучит так, как будто запрос выполняется слишком долго.Веб-браузеру разрешено хранить только два одновременных подключения к одному веб-серверу, если только вы не используете конвейерную обработку http (которая в любом случае не поддерживается).Однако мой опыт показывает, что это для браузера, а не для вкладки.

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

ASP.NET использует только один поток, если все запросы являются последовательными.Как только вы запускаете два запроса одновременно, инициируется новый поток (вызывается Init () в HttpApplication), и это может привести к периодическим ошибкам, если вы делаете прикольные вещи в Init ().

Если вы считаете, что это связано с EF, вы можете прочитать о том, как избежать блокировки в многопоточной среде (поскольку веб-приложение очень многопоточное, однако это обычно срабатывает в производственной среде).

0 голосов
/ 29 марта 2011

У меня есть новая информация по этой проблеме.

Приложение использует встроенную аутентификацию.Это приводит к тому, что каждый запрос возвращается (дважды) с отказом в доступе, прежде чем IE отправит учетные данные.

Я не могу не задаться вопросом, может ли это быть причиной истечения времени ожидания.

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

Хотя это все еще происходит довольно часто.

0 голосов
/ 27 февраля 2011

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

Попробуйте использовать профилировщик SQL, чтобы отследить действие и определить, какие процессы выполняютсядолгое время.

Вы можете дифференцировать запросы, используя столбец SPID в представлении трассировки, он содержит уникальный идентификационный номер для каждого сеанса из вашего приложения.

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