我正在尝试构建(csharp)一个做出两个动作的webservice / WCF引擎:
有一个计时器(线程),每10-10分钟运行一次,请求一些信息(连接其他服务器获取一些信息 - 状态)在一个数据库中更新。 (这必须是自动的,不会有任何人为操作)。这个想法是webservice automaticaly(10x10分钟)用最近的信息状态更新数据库。
从一个数据库获取一些信息的一种服务方法。 (这是一种在有人请求时提供信息的简单方法)。此方法将负责从数据库中选择状态信息。
问题在于步骤1,因为第2步非常简单。
任何人都可以通过创意或一些代码帮助我,如何进行第1步。 这里应该使用任何模式吗?
答案 0 :(得分:2)
由于它是一个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();
}
}
答案 1 :(得分:0)
单一责任原则建议您将这两项职责分为两项服务。一个(Windows服务)将处理Timer。第二个是WCF服务,它将具有查询数据库并返回数据的单一操作。
这些是独立的功能,应该独立实施。
此外,我建议不要依赖IIS或Application_Start
和类似的方法。这将阻止您的WCF服务在WAS或其他环境中托管。请记住,WCF比ASMX Web服务更灵活。它不限制您托管服务的位置。在对自己的服务施加此类限制之前,您应该仔细考虑。