Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 指定要无限期持续的WCF服务会话_C#_Timeout_Wcf_Servicebehavior - Fatal编程技术网

C# 指定要无限期持续的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

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

这很可能与主机进程有关,而不是与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服务方法?