Служба отдыха WCF переходит в спящий режим после бездействия - PullRequest
2 голосов
/ 27 апреля 2011

У меня есть служба WCF REST, объявленная в обычном веб-проекте ASP.NET:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, IncludeExceptionDetailInFaults = true)]
public class BasicApp

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

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

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

Я предполагаю, что это проблема конфигурации. Служба размещена на Win2008R2 с IIS 7.5

Веб-сайт IIS настроен на собственный AppPool с платформой .NET Framework v4 с интегрированным конвейером.

У кого-нибудь есть идеи, как решить эту проблему?

Ответы [ 6 ]

18 голосов
/ 07 мая 2013

Нет необходимости пинговать ваш сервер, вот скриншот настройки в разделе дополнительных настроек пула приложенийИзмените режим запуска на AlwaysRunning, и он перестанет спать.

7 голосов
/ 23 апреля 2012

Здесь рассказывается, как настроить автозапуск, это в настройках applicationHost.config для вашего appPool

http://msdn.microsoft.com/en-us/library/ee677260.aspx

добавлено для полноты C: \ Windows \ System32 \ Inetsrv \ Config \ applicationHost.config

<applicationPools>
    <add name=”MyAppPool” startMode=”AlwaysRunning” />
</applicationPools>
4 голосов
/ 27 апреля 2011

Поскольку вы используете IIS 7.5, вы можете включить автозапуск приложения в своем веб-приложении, это гарантирует, что служба останется «живой».

- larsw

3 голосов
/ 27 апреля 2011

Пул приложений, в котором размещается ваша служба, определяет свойство Idle Time-out (расширенные настройки пула приложений в консоли управления IIS), которое по умолчанию составляет 20 минут.Если в течение неактивного периода пул приложений не получен, рабочие процессы, обслуживающие пул, завершаются.После получения нового запроса IIS должен снова запустить процесс, процесс должен загрузить домен приложения и все связанные сборки, скомпилировать файл .svc, запустить хост службы и обработать запрос.

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

Редактировать: Этот ответ устарел -он был написан для старых версий IIS, где опция AlwaysRunning была недоступна.Пожалуйста, проверьте другие ответы.

0 голосов
/ 01 июня 2016

Здесь представлен компромисс между созданием службы Windows WCF с собственным размещением и отключением свойств времени простоя AppPool и перезаписью и службой проверки связи каждую минуту.

Есть 2 события.5074 - Переработка пула приложений IIS 5186 - Переработка пула приложений IIS

Для этих типов событий можно прикрепить обработчик событий (запустить скрипт PowerShell).Описано здесь: Запуск сценария PowerShell из события Windows

Сценарий PowerShell:

param($eventRecordID,$eventChannel)

Start-Sleep -s 1

$query2 = @"
    <QueryList><Query Id='0' Path='$eventChannel'><Select Path='$eventChannel'>*[System[(EventRecordID=$eventRecordID)]]</Select></Query></QueryList>
"@

$Events = Get-WinEvent -FilterXml $query2
if($Events.Count -gt 0)
{
    $evt1 = [xml]$Events[0].toXML()

    $appPool  = $evt1.event.EventData.Data | where { $_.Name -eq 'AppPoolID' }
    if($appPool)
    {
        $appPoolID = $appPool.'#text'

        switch($appPoolID)
        {
            "AppPool" { Invoke-WebRequest -Method Head -Uri http://localhost:8080 }
            default {}
        }
    }
}

Итак, каждый раз, когда служба, размещенная на IIS, «спит»Вы осторожно просыпаетесь.

0 голосов
/ 15 декабря 2015

artfulhacker понял это правильно.Переключение startMode на AlwaysRunning позволило веб-службе всегда работать.Мы используем IIS с AAR / Server Farms для балансировки нагрузки.Вот снимок экрана настройки startMode в IIS6 / WinServer 2003. IIS6 startMode

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