通过计时器呼叫控制器

时间:2012-03-07 04:55:44

标签: c# .net asp.net-mvc

我必须向远程程序发送查询并接收数据。然后将它们放入我的数据库中。 例如,这可以每隔60秒调用一次控制器的动作吗?

感谢。

PS。我认为必须在服务器端完成。不是JS解决方案。

更新

首先,我有MS SQL Server DB 第二,有远程程序监听特定的TCP端口并等待查询。我想每60秒发送一次查询并解析响应,然后将解析后的数据放入我的MS SQL Server DB中。

5 个答案:

答案 0 :(得分:1)

使用Ajax,您可以创建一个计时器,每隔x秒将数据发送到控制器。 我的Web应用程序中的拼写检查器插件可以在您键入时进行拼写检查。

答案 1 :(得分:1)

我认为你最好使用在后台运行的独立服务(windows,wcf,msmq等)并“发送查询”并保存到你的数据库。

Web应用程序并非旨在用作基于时间的“永远存活”机制。 “定时”需要状态,HTTP是无状态协议。

不要试图将功能强加于非设计用于处理它的东西。

然后,我可能完全误解了你的问题。很可能。

令人困惑的陈述:

  

这可以调用控制器的动作

如果它是外部的,你怎么知道它是一个控制器?这是外部API吗?

  

有远程程序监听特定的TCP端口并等待查询

这听起来不像是一个Web应用程序/控制器。

答案 2 :(得分:1)

你可以在* nix基础系统上使用cron。或者您的程序可以每小时触发事件

0 * * * *  lynx url-of-your-program-address.com/action/to/call

答案 3 :(得分:1)

你的问题令人困惑。但是,因为我们只是在这里猜测你在做什么,这里的解决方案可能会接近。

(P.S。我没有编译或测试过这个......因为我为什么要关心)

class ConsoleApplication
{
public static void Main()
{
  Timer myTimer = new Timer();
  myTimer.Elapsed += new ElapsedEventHandler( DoAction );
  myTimer.Interval = 1000;
  myTimer.Start();

  while ( Console.Read() != 'q' )
  {
      ;    // do nothing...
  }
}

public static void DoAction( object source, ElapsedEventArgs e )
{
    Console.WriteLine("Made request at {0}", DateTime.Now);

    using (WebClient client = new WebClient())
    {               
        using (Stream stream = client.OpenRead("http://whereever"))
        using (StreamReader reader = new StreamReader(stream))
        {
            Console.WriteLine(reader.ReadToEnd());
        }
    }
}
}

答案 4 :(得分:1)

根据您的解决方案的灵活性,我会使用Quartz.Net来使用带有Timer的Windows服务解决方案。 您可以使用http://quartznet.sourceforge.net/

下面的链接找到更多详细信息