1

我是 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 服务会话似乎因不活动而到期,这可以解释为什么计时器会停止。有没有办法指定 WCF 服务的生命周期,以便我可以从 aspx 页面启用计时器,退出,并且计时器服务将持续存在?我已经看到有关设置超时值的信息,但我仍然不清楚这是否适用。

4

2 回答 2

1

其他是正确的,您不想使用 WCF 进行实际的任务调度。虽然理论上可以摆弄应用程序池回收,但这绝对不是理想的路线。使用 Windows 任务调度将是一个很好的解决方案。完成此操作的最简单方法是通过 REST 公开 WCF 服务(通过在 .svc 文件中使用 Factory="System.ServiceModel.Activation.WebServiceHostFactory"。)这样,您可以让 Windows 任务调度通过访问网址。

于 2010-07-28T22:19:23.350 回答
0

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

虽然您可以使用 IIS 配置或创建您打算长期运行的自定义主机进程,但这对于 WCF 来说根本不是一个好的方案。

即使是标准的 Windows 服务进程对于应该每周执行的操作来说似乎也有些过分了。为什么不直接使用 Windows 任务计划程序来计划任务?如果它是长期运行的工作流的一部分,也许您应该考虑查看 Windows Workflow Foundation。

于 2010-07-28T02:21:07.750 回答