2010-07-28 42 views
1

我是WCF的新手,所以也许这是最好的另一种方式。指定一个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 page.For测试,我已经成功地做这项工作10周分钟的时间间隔,并它似乎在将间隔设置为15分钟左右的时候出现断点。

对我来说,看起来WCF Serivce会话将从不活动状态过期,这可以解释计时器刚刚停止的原因。有没有一种方法来指定WCF服务的生命周期,以便我可以从aspx页面启用计时器,退出,并且定时器服务将会持续下去?我已经看到有关设置超时值的信息,但是我仍然不清楚这是否适用。

+1

只是好奇你为什么没有把它设置为Windows服务或托管在Windows服务中。听起来像是长时间运行,预定活动,很少或没有用户交互的良好候选人。 – 2010-07-28 02:07:45

+2

它实际上听起来像是一个更好的计划任务的候选人。 – Josh 2010-07-28 02:22:42

+0

事情是我需要,当我触发我需要调用我的其他现有的Web服务之一,有没有一种简单的方法来做到这一点? – BTmuney 2010-07-28 05:25:43

回答

1

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

0

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

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

即使是一个标准的Windows服务进程似乎对每周应该采取行动的东西来说都是过分的。为什么不使用Windows任务计划程序来安排任务?如果它是长期运行的工作流程的一部分,也许您应该考虑查看Windows Workflow Foundation。

+0

如果我走这条路线,问题是我如何在TimerElapsed方法中运行我的代码。这是在另一个Web服务上运行的。是否有一种简单的方法可以在脚本中执行此操作(也许是PowerShell)?我将如何使用任务计划程序来运行该Web服务方法? – BTmuney 2010-07-28 05:28:14