C# 指定要无限期持续的WCF服务会话
我是WCF的新手,所以也许这是最好的另一种方式 现在我有一个WCF服务的集合,但我正在尝试建立每周发送电子邮件的功能。为此,我构建了另一个WCF服务,代码如下:C# 指定要无限期持续的WCF服务会话,c#,timeout,wcf,servicebehavior,C#,Timeout,Wcf,Servicebehavior,我是WCF的新手,所以也许这是最好的另一种方式 现在我有一个WCF服务的集合,但我正在尝试建立每周发送电子邮件的功能。为此,我构建了另一个WCF服务,代码如下: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, AutomaticSessionShutdown = false)] public class TimerService : ITimerService { private static Time
[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页面启用计时器,退出,计时器服务将保持不变?我已经看到了有关设置超时值的信息,但我仍然不清楚这是否适用。这很可能与主机进程有关,而不是与WCF实例上下文行为有关。只要宿主进程允许,“单个”实例上下文就应该存在。但是IIS默认情况下会在各种情况下回收工作进程。这些条件可能包括即使是正常进程的最长生存期,但运行状况检查期间的内存占用和延迟也可能导致IIS终止进程 虽然您可以使用IIS配置或创建一个要长期运行的自定义主机进程,但这对于WCF来说根本不是一个好方案
即使是一个标准的Windows服务流程,对于每周都应该运行的东西来说,也似乎有些过头了。为什么不使用Windows任务计划程序来计划任务呢?如果它是一个长时间运行的工作流的一部分,也许你应该考虑查看Windows工作流基础。
这很可能与主机进程有关,而不是WCF实例上下文行为。只要宿主进程允许,“单个”实例上下文就应该存在。但是IIS默认情况下会在各种情况下回收工作进程。这些条件可能包括即使是正常进程的最长生存期,但运行状况检查期间的内存占用和延迟也可能导致IIS终止进程
虽然您可以使用IIS配置或创建一个要长期运行的自定义主机进程,但这对于WCF来说根本不是一个好方案即使是一个标准的Windows服务流程,对于每周都应该运行的东西来说,也似乎有些过头了。为什么不使用Windows任务计划程序来计划任务呢?如果它是一个长时间运行的工作流的一部分,也许你应该考虑查看Windows工作流基础。 < P>其他人是正确的,你不想使用WCF来进行实际的任务调度。虽然从理论上讲,处理应用程序池回收是可能的,但这绝对不是理想的途径。使用windows任务调度将是一个很好的解决方案。实现这一点的最简单方法是通过REST(在.svc文件中使用Factory=“System.ServiceModel.Activation.WebServiceHostFactory”)公开WCF服务,您可以让Windows任务调度通过访问URL来调用您的服务。其他人是正确的,您不想使用WCF进行实际的任务调度。虽然从理论上讲,处理应用程序池回收是可能的,但这绝对不是理想的途径。使用windows任务调度将是一个很好的解决方案。实现这一点的最简单方法是通过REST(在.svc文件中使用Factory=“System.ServiceModel.Activation.WebServiceHostFactory”)公开WCF服务,您可以让Windows任务调度通过访问URL来调用您的服务。只是好奇为什么您没有将其设置为Windows服务或托管在Windows服务中。听起来是一个很好的选择--长时间运行、计划活动、很少或没有用户交互。实际上,它更适合计划任务。问题是,当我触发时,我需要调用我的另一个现有web服务,有没有一种简单的方法可以做到这一点?只是好奇为什么你没有将它设置为Windows服务或托管在Windows服务中。听起来是一个很好的选择--长时间运行、计划活动、很少或没有用户交互。实际上,它似乎是一个更好的选择,适合计划任务。问题是,当我触发时,我需要调用我的其他现有web服务,有没有一种简单的方法可以做到这一点?如果我这样做,问题是如何在TimeRecursed方法中运行代码。这正在另一个web服务上运行。在脚本(可能是powershell)中有没有一种简单的方法可以做到这一点?我将如何使用任务调度器来运行该web服务方法?如果我采用该方法,问题是如何在TimeRecursed方法中运行代码。这正在另一个web服务上运行。在脚本(可能是powershell)中有没有一种简单的方法可以做到这一点?如何使用任务调度器来运行该web服务方法?