Сайт asp.net перестает отвечать при выполнении тяжелого запроса - PullRequest
2 голосов
/ 27 сентября 2011

У меня есть сайт asp.net, который приближается к выпуску.Сайт посвящен управлению бизнесом.Одна из вещей, которые я делаю, чтобы подготовиться к выпуску, - загрузить целую кучу данных из купленных списков предприятий в нашу базу данных SQL.Для этого я использую очень простой метод: я помещаю файлы .csv в папку на сервере и использую событие Page_Load на временной странице, чтобы выполнить логику, необходимую для обработки данных и помещения их в нашу базу данных..

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

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

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

Я вполне уверен, что это не так.Это не проблема с SQL Server, так как я могу выполнять одновременные запросы во время работы этого процесса, поэтому, возможно, что-то не так с веб-сервером.

Я не могу опубликовать фрагмент кода, потому чтоэто долго наматывается и технический.Однако ничего сложного не происходит: метод считывает данные из файла .csv, обрабатывает их и отправляет HTTP-запрос внешней службе для каждой строки файла, чтобы собрать некоторые более важные данные.Затем все данные вставляются в базу данных SQL.

Насколько я понимаю, веб-серверы не должны блокироваться таким образом.Они должны быть в состоянии одновременно обслуживать страницы для множества пользователей одновременно, даже если одному потоку / пользователю требуется много ресурсов.

Кто-нибудь может подсказать, что может быть?С чего мне начать искать решение?

Ответы [ 3 ]

2 голосов
/ 27 сентября 2011

ASP.NET не предназначен для интенсивной обработки. Страница ASP.NET должна просто вызвать действие. Фоновый процесс должен сделать тяжелую работу. Оба могут общаться, используя очередь или что-то подобное. Веб-страница должна просто сообщать о состоянии фоновых задач.

Эта парадигма является центральной в современных вычислениях (особенно в облачных вычислениях).

2 голосов
/ 27 сентября 2011

Запрос обрабатывается асинхронным обработчиком.

http://msdn.microsoft.com/en-us/library/ms227433%28v=vs.85%29.aspx

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

1 голос
/ 27 сентября 2011

Пожалуйста, обратитесь к http://msdn.microsoft.com/en-us/library/ff647787.aspx#scalenetchapt06_topic8 от MSDN.

Мне кажется, проблема в том, что вы используете настройки по умолчанию для asp.net, где у вас недостаточно потоков и только 2 исходящих tcp / ip-соединения. Это просто ужасно для реального сайта.

Пожалуйста, измените maxconnections, maxworkerthreads и другие в вашем machine.config. Существует формула для некоторых из этих настроек, таких как 12 * количество процессоров и т. Д.

Это должно дать вам повышение производительности, которое вам нужно.

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

Редактировать: -

Мои комментарии были до того, как я узнал о настройке autoconfig = true в machine.config. Я провел предварительное исследование и обнаружил, что эти настройки работают для большинства приложений. таким образом, эти индивидуальные настройки необходимы только для специализированных сценариев, которые могут потребовать тщательно продуманных оптимизаций.

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