2010-08-10 159 views
2

我试图建立(CSHARP)一个web服务/ WCF引擎,使两个动作:web服务/ WCF(定时更新引擎)

  1. 有一个定时器(线程),将在每个10跑10分钟,请求一些信息(与其他服务器连接以获取一些信息状态)在一个数据库中更新。 (这必须是自动的,不会有任何人为操作)。这个想法是web服务automaticaly(10x10分钟)用最新的信息状态更新数据库。

  2. 一个服务方法得到一个数据库的一些信息。 (这是一个简单的方法,在有人请求时提供信息)。该方法将负责从数据库中选择状态信息。

问题是第1步,因为第2步非常容易。

谁能帮我,有想法或一些代码,如何将步骤1 任何模式应该用在这里?

回答

2

因为它是一个Web应用程序(例如,在VS2010了“WCF服务应用程序”项目类型),你可以连接到应用程序的事件。

默认情况下,该项目的模板类型不会创建一个Global.asax,所以你需要在“添加新项”,然后选择“全局应用程序类”(这将不可用,如果你已经有了一个全球.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(); 
    } 
} 
+0

首先感谢您的答案! 是IIS中的一个webapp(webservice)。 这个动作(点1)在这个项目中非常重要。我必须避免并尝试获得最佳解决方案,以避免糟糕的表现或停止服务。相同的web服务向所有300台服务器请求一些信息(x在x分钟内 - 使用套接字请求信息)并且用作服务以向客户端应用提供更新信息。 我需要使用System.Threading.Timer,但我必须找到最好的解决方案。 你知道我是否应该在这里使用任何模式?从任何书籍的任何好信息你的文章? 再次感谢 – rbfigueira 2010-08-10 10:39:41

+0

我需要在web服务使用System.Threading.Timer但我必须找到使得它的最佳解决方案。状态信息来自300多个不同和不同的服务器。我必须每10-10分钟一次(使用套接字请求信息)。 谢谢 – rbfigueira 2010-08-10 10:45:17

+0

重写了特定于WCF webapp/webservice场景的答案,并给出了一些示例代码 – 2010-08-11 04:24:17

0

单一职责原则表明,你应该拆分这两个职责为两项服务。一个(Windows服务)将处理定时器。第二个WCF服务将有单个操作来查询数据库并返回数据。

这些是独立的功能,应该独立执行。

此外,我会建议不要依赖于IIS或Application_Start和类似的方法。这将阻止您的WCF服务托管在WAS或其他环境中。请记住,WCF比ASMX网络服务更加灵活。它不会限制您的服务托管位置。在对自己的服务进行限制之前,您应该仔细考虑。

+0

John,您是对的,但在这种情况下,我们需要在同一个Web服务中承担这两项责任。也许你可以在这种特殊情况下指出我们需要使用的更多原则或模式。谢谢 – rbfigueira 2010-08-11 09:41:00

+0

你能指点我其他的解决方案(模式,想法等)吗?记住我需要在同一个Web服务中承担这两项责任? – rbfigueira 2010-08-11 09:51:03

+0

@rbfigueira:你还没有说过他们为什么需要在同一个服务中。 – 2010-08-11 19:03:25