Как программно утилизировать собственный пул приложений веб-приложения .net? - PullRequest
9 голосов
/ 27 февраля 2012

У меня есть сложное серверное приложение, которое использует Nhibernate и Linq2SQL.Примерно 3 раза в день код Linq2sql генерирует исключение «значение не может быть пустым».Как только это произойдет, код всегда будет генерировать исключение.Диагностика и устранение основной причины будут длительными и привнесут нестабильность.

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

Редактировать: Ошибка на обоих серверах веб-фермы с балансировкой нагрузки.Клиенты не переключаются с одного сервера на другой только из-за сбоя этого кода.

Ответы [ 4 ]

23 голосов
/ 07 мая 2014

Следующий код перезапустит пул приложений текущего сайта. Вам необходимо добавить ссылку на Microsoft.Web.Administration

using (ServerManager iisManager = new ServerManager())
{
    SiteCollection sites = iisManager.Sites;
    foreach (Site site in sites)
    {
       if (site.Name == HostingEnvironment.ApplicationHost.GetSiteName()) 
       {
         iisManager.ApplicationPools[site.Applications["/"].ApplicationPoolName].Recycle();
         break;
       }
    }
}
2 голосов
/ 27 февраля 2012

Самый простой способ «задействовать» рабочий процесс ASP.NET в переработке пула приложений - это каким-то образом изменить файл web.config.Это изменение отслеживается наблюдателем файловой системы и вызывает перезапуск ASP.NET для загрузки новой конфигурации.

Содержимое файла не должно изменяться каким-либо практическим образом;достаточно просто добавить или удалить символ пробела.

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

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

// Set up the path identifying your application pool.
var path = "IIS://YOURSERVERNAME/W3SVC/AppPools/YourAppPoolName";

// Create the directory entry to control the app pool
var appPool = new DirectoryEntry(path);

// Invoke the recycle action.
appPool.Invoke("Recycle", null);

На основе Код проекта: программная переработка пулов приложений IIS 6.0 .

0 голосов
/ 29 августа 2012

Решение, которое я в итоге выбрал, состояло в том, чтобы установить максимальное значение для объема памяти, которое appPool было разрешено использовать. Затем код просто сожрал память, пока asp.net решил перезапустить appPool.

В расширенных настройках пула приложений я установил лимит частной памяти равным 800 000 КБ.

В разделе Catch, где произошел сбой кода Linq, я выделяю больше памяти, чем предел:

List<string> listOfMemory = new List<string>();

// in the app pool, you need to set the virtual memory limit to 800,000kb
log.Error("Allocating so much memory that the app pool will be forced to recycle... ");
for (int intCount = 1; intCount < 10000000; intCount++)
{
listOfMemory.Add("new string " + intCount.ToString());
}

Теперь это означает, что только около 4 потоков перестают работать до появления нового процесса w3wp. До этого решения потоки постоянно терпели неудачу, пока человек не перезапустил пул приложений вручную. К сожалению, если вы устанавливаете пул приложений на регулярную перезагрузку в течение определенного количества минут, чем меньше количество минут, тем чаще происходит сбой. И чем больше минут, тем больше сбоев будет.

Этот творческий обходной путь ограничивает урон.

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

У меня была точно такая же проблема раньше;Я должен был написать об этом в блоге, потому что теперь я не могу вспомнить основную причину.

Моя интуиция говорит мне, что это было одно из следующих действий:

  1. Контекст не был удален где-то.
  2. Проблема с потоками: убедитесь, что несколько потоков не могут получить доступ к одному и тому же контексту.

Или что-то в этом духе.Просто убедитесь, что вы используете Linq2Sql правильно.

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