C# Webservice/WCF(计时器更新引擎)

C# Webservice/WCF(计时器更新引擎),c#,web-services,wcf,C#,Web Services,Wcf,我正在尝试构建(csharp)一个webservice/WCF引擎,它可以执行两个操作: 有一个计时器(线程),每10-10分钟运行一次,请求在一个数据库中更新一些信息(与其他服务器连接以获取一些信息状态)。(这必须是自动的,并且没有可用的人工操作)。其思想是Web服务自动(10x10分钟)用最新的信息状态更新数据库 一种从一个数据库获取一些信息的服务方法。(这是一种在有人请求时提供信息的简单方法)。此方法将负责从数据库中选择状态信息 问题在于第一步,因为第二步非常简单 有谁能帮我,提供一些想法

我正在尝试构建(csharp)一个webservice/WCF引擎,它可以执行两个操作:

  • 有一个计时器(线程),每10-10分钟运行一次,请求在一个数据库中更新一些信息(与其他服务器连接以获取一些信息状态)。(这必须是自动的,并且没有可用的人工操作)。其思想是Web服务自动(10x10分钟)用最新的信息状态更新数据库

  • 一种从一个数据库获取一些信息的服务方法。(这是一种在有人请求时提供信息的简单方法)。此方法将负责从数据库中选择状态信息

  • 问题在于第一步,因为第二步非常简单

    有谁能帮我,提供一些想法或代码,如何完成步骤1。 这里应该使用任何模式吗?

    因为它是一个webapp(例如,VS2010中的“WCF服务应用程序”项目类型),所以您可以连接到应用程序事件

    默认情况下,该项目模板类型不会创建Global.asax,因此您需要“添加新项”并选择“全局应用程序类”(如果您已经有Global.asax,FWIW,则该类将不可用)

    然后,您可以使用应用程序上的开始和结束事件来启动和停止计时器,例如:

    public class Global : System.Web.HttpApplication
    {
        private static readonly TimeSpan UpdateEngineTimerFrequency = TimeSpan.FromMinutes(10);
        private Timer UpdateEngineTimer { get; set; }
    
        private void MyTimerAction(object state)
        {
            // do engine work here - call other servers, bake cookies, etc.
        }
    
        protected void Application_Start(object sender, EventArgs e)
        {
            this.UpdateEngineTimer = new Timer(MyTimerAction,
                                               null, /* or whatever state object you need to pass */
                                               UpdateEngineTimerFrequency,
                                               UpdateEngineTimerFrequency);
        }
    
    
        protected void Application_End(object sender, EventArgs e)
        {
            this.UpdateEngineTimer.Dispose();
        }
    }
    

    单一责任原则建议您将这两项责任分为两项服务。一个(Windows服务)将处理计时器。第二个是WCF服务,它将具有查询数据库和返回数据的单一操作

    这些是独立的功能,应该独立实施


    此外,我建议不要依赖IIS或
    应用程序启动
    和类似方法。这将阻止您的WCF服务托管在WAS或其他环境中。请记住,WCF比ASMXWeb服务灵活得多。它不限制您托管服务的位置。在对自己的服务设置此类限制之前,您应该仔细考虑。

    首先感谢您的回答!是IIS中的一个webapp(webservice)。该行动(第1点)在本项目中非常重要。我必须避免并尝试获得最佳解决方案,以避免性能不佳或停止服务。同一Web服务向所有300台服务器请求一些信息(x分钟内x分钟-使用套接字请求信息),并用作向客户端应用程序提供更新信息的服务。我需要使用System.Threading.Timer,但我必须找到最好的解决方案。你知道我应该在这里用什么图案吗?你的文章中有什么好的信息吗?谢谢,我需要在Web服务中使用System.Threading.Timer,但我必须找到最好的解决方案。状态信息来自300多个不同的服务器。我必须集中(使用套接字请求信息)每个10-10分钟。感谢您针对WCF webapp/webservice场景给出了答案,并给出了一些示例code@James:默认配置是否包含ASP.NET兼容性?再次感谢James提供的示例代码;D我们需要有两点可用(1-定时器请求信息;2-提供一种从一个数据库获取信息的服务方法)。为了避免性能问题,我认为我们应该并且需要使用一个不同的线程来隔离这个计时器。你认为呢?John,你是对的,但在这种情况下,我们需要在同一个web服务中承担这两项责任。也许你可以指出更多的原则或模式,我们需要在这个特殊的情况下使用。谢谢你告诉我其他的解决方案(模式、想法等),让我记住我需要在同一个web服务中承担这两个职责?@RBFIGUERA:你还没有说为什么它们需要在同一个服务中。就像我说的,我理解你的观点,但前提是所有的功能都在web上,不依赖Windows,通过web进行更多的控制。我们在Java(Web服务)中有很多这样的服务。这是一个dotnet项目,我们必须使用dotnet。谢天谢地,另一个好处是我们可以在基于参数的多个web应用程序上重用相同的“引擎”。