Указание сеанса службы WCF для постоянного хранения - PullRequest
1 голос
/ 28 июля 2010

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

Сейчас у меня есть коллекция служб WCF, но я пытаюсь встроить функциональность, которая отправляет еженедельные электронные письма. Для этого я построил еще одну службу WCF с кодом ниже:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, AutomaticSessionShutdown = false)]
public class TimerService : ITimerService
{
    private static Timer timer;
    private static TimeSpan tSpan = new TimeSpan(0, 0, 20, 0);
    private static OtherService Ref = new OtherService();

    public void ToggleEmailTimer(bool enabled)
    {
        if (enabled)
            timer = new Timer(new TimerCallback(TimerElapsed), null, tSpan, tSpan);
        else
        {   
            if(timer != null)
                timer.Dispose();
        }
    }

    private void TimerElapsed(object state)
    {
        Ref.SendWeekly();
    }
}

Он начинает отключаться, и я включаю его со страницы aspx. Для тестирования мне удалось выполнить эту работу за 10-минутные интервалы, и, кажется, что-то сломалось, установив интервал в 15 минут.

Мне кажется, что сеанс WCF Serivce истекает из бездействия, что объясняет, почему таймер просто останавливается. Есть ли способ указать время жизни службы WCF, чтобы я мог включить таймер со страницы aspx, выйти, и служба таймера будет сохраняться? Я видел информацию о настройке значений времени ожидания, но мне все еще неясно, применимо ли это.

Ответы [ 2 ]

1 голос
/ 29 июля 2010

Остальные верны, что вы не хотите использовать WCF для фактического планирования задач. Хотя теоретически можно возиться с утилизацией пула приложений, это определенно не идеальный маршрут. Использование планирования задач Windows было бы хорошим решением. Самый простой способ сделать это - показать ваши службы WCF через REST (используя Factory = "System.ServiceModel.Activation.WebServiceHostFactory" в вашем файле .svc.) Таким образом, вы можете настроить планирование задач Windows для вызова вашей службы путем доступа к URL.

0 голосов
/ 28 июля 2010

Скорее всего, это связано с процессом хоста, а не с поведением контекста экземпляра WCF.«Единый» контекст экземпляра должен существовать до тех пор, пока процесс хоста позволяет это.Но IIS по умолчанию перезапускает рабочие процессы при различных условиях.Эти условия могут включать в себя максимальное время жизни даже работоспособного процесса, но также использование памяти и задержка во время проверок работоспособности могут привести к прерыванию процесса IIS.

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

Даже стандартный процесс службы Windows кажется чрезмерным для чего-то, что должно действовать еженедельно.Почему бы просто не запланировать задачу с помощью планировщика задач Windows?Если это часть продолжительного рабочего процесса, возможно, вам стоит рассмотреть Windows Workflow Foundation.

...