Как к: Предотвращение проблем Холодного запуска с IIS разместило приложения WCF?

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

У клиента также есть требование для переработки пулов приложений каждую ночь.

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

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

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

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

Любые идеи очень ценились бы.

Спасибо

Gineer

6
задан Gineer 24 February 2010 в 16:00
поделиться

2 ответа

я сделал так, как сказал Иисус Навин. он работал для одного изображения. (спасибо Джошуа)

я также хотел добавить решение для изменения размера партии, потому что

convert -resize 1024x1024! *.png

не работал


, поэтому здесь есть пример команды для рабочего образца .

mkdir scaled
for %%x in (*.png) do convert -resize 1024x1024! %%x .\scaled\%%x
-121--3520287-

Я расширяю ответ Лахлана Роша, который является правильным.

Структура ASP.NET будет «однопоточными» запросами, которые имеют отношение к области сеанса (глобальный ресурс), чтобы предотвратить вмешательство одного запроса в другой. В WebForms я думаю, что вы можете использовать директиву Страница, чтобы указать, что отдельные страницы не используют Сеанс и поэтому не нужно рассматривать синхронно, как это.

Проблема заключается в том, что в ASP.NET MVC все запросы используют сеанс , поскольку он используется для реализации TempData. Вы можете полностью отключить состояние сеанса, как указал Лахлан Рош, или можете справиться с этим в каждом конкретном случае.

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

-121--1271592-

Для тех из нас, кто работает на версии IIS до 7.5, мы находимся в процессе тестирования следующего решения...

Как упоминалось в первоначальном сообщении, первоначальная идея состояла в том, чтобы запустить WebRequest от службы, запущенной на каждой машине, к локальным веб-сайтам (на которых размещены службы WCF), но это было бы невозможно, поскольку все они используют заголовки Host, и все они живут в ферме с балансировкой сетевой нагрузки.

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

Невозможно обновить имя заголовка узла в WebRequest. Это поле только для чтения.

Сообщение с прокси-классом делает его работоспособным. См. http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1b35c665-fe32-4433-8877-a62f2d400a8e/

И короткий фрагмент моего тестового кода ниже в C #.

        WebRequest req = WebRequest.Create("<Correct Host name>");
        req.Proxy = new WebProxy("127.0.0.1");

        StreamReader stream = new StreamReader(
            req.GetResponse().GetResponseStream());

        StringBuilder sb = new StringBuilder();

        String LineString;

        while ((LineString = stream.ReadLine()) != null)
        {
            if (LineString.Length > 0)
                sb.Append(LineString);
        }
        stream.Close();

        String response = sb.ToString();

Возможно, это не то, для чего предназначался класс прокси, но он работает в любом случае.

Гинеер

Ps. Нет, на локальном хост-компьютере не требуется устанавливать прокси-сервер.

2
ответ дан 17 December 2019 в 04:46
поделиться

Отлично. Спасибо Dercsár .

После быстрого Google я обнаружил следующую статью на эту тему: Использование модуля разогрева приложения IIS

Ограничения заключаются в том, что он доступен только в Windows 2008 R2 с IIS 7.5. Несмотря на то, что наш клиент находится в процессе обновления до Win 2K8R2, это еще может занять некоторое время.

Кто-нибудь знает решение, которое будет работать для Windows 2003 с IIS 6, или нам придется что-то написать, чтобы это работало?

Gineer

3
ответ дан 17 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: