开发者

Webservice/WCF (timer update engine)

I am trying to build (csharp) one webservice /WCF engine that make two actions:

  1. Have one timer (thread), that will run in each 10-10 minutes, requesting some information (connecting with other server to grab some info - status) to update in one database. (This must be automatic and no human action will be available). The idea is the webservice automaticaly (10x10 minutes) update the database with the recent information status.

  2. One service method that get some information from one database. (Thi开发者_开发百科s is one simple method that gives the information when someone request it). This method will responsible to select the status info from database.

The problem is the step 1, because step 2 is very easy.

Can anyone help me, with ideas or some code, how to the step 1. Any pattern should be used here?


Since it's a webapp (for instance, a "WCF Service Application" project type in VS2010), you can hook into the application events.

By default that project template type doesn't create a Global.asax, so you'll need to "add new item" and choose "Global Application Class" (it won't be available if you already have a Global.asax, FWIW).

Then you can just use the start and end events on the application to start and stop your timer, so something like:

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();
    }
}


The Single Responsibility Principle suggests that you should split these two responsibilities into two services. One (a Windows Service) would handle the Timer. The second, the WCF Service, would have the single operation to query the database and return the data.

These are independent functions, and should be implemented independently.

Additionally, I would recommend against depending on IIS or Application_Start and similar methods. That will prevent your WCF service from being hosted in WAS or some other environment. Keep in mind that WCF is much more flexible than ASMX web services. It doesn't restrict where you host your service. You should think carefully before you place such restrictions on your own service.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜