指定WCF服务会话无限期保留

时间:2010-07-28 01:44:28

标签: c# timeout wcf servicebehavior

我是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 个答案:

答案 0 :(得分:1)

其他人都是正确的,您不希望将WCF用于实际的任务调度。虽然理论上可以摆弄应用程序池回收,但它绝对不是理想的路线。使用Windows任务调度将是一个很好的解决方案。实现此目的的最简单方法是通过REST公开您的WCF服务(在.svc文件中使用Factory =“System.ServiceModel.Activation.WebServiceHostFactory”。)这样,您可以让Windows任务调度通过访问来调用您的服务URL。

答案 1 :(得分:0)

这很可能与宿主进程有关,而与WCF实例上下文行为无关。只要主机进程允许,“单个”实例上下文就应该存在。但IIS默认会在各种条件下回收工作进程。这些条件可以包括即使是健康过程的最大生命周期,但是在运行状况检查期间内存占用和延迟可能导致IIS终止进程。

虽然您可以使用IIS配置或创建您打算长时间运行的自定义主机进程,但这根本不适合WCF。

即使是标准的Windows服务流程,对于本周应该采取行动的事情来说也似乎有些过分。为什么不使用Windows任务计划程序安排任务?如果它是长时间运行的工作流的一部分,也许你应该考虑研究Windows Workflow Foundation。