我是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页面启用计时器,退出,并且计时器服务将保持不变?我已经看到有关设置超时值的信息,但如果适用,我仍然不清楚。
答案 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。