C# 如何执行始终在后台运行的ASP.NET后台服务?

C# 如何执行始终在后台运行的ASP.NET后台服务?,c#,asp.net,C#,Asp.net,我有一个非常有趣的问题。我有一个asp.net网站。我需要的是独立的服务,应该总是在后台运行。例如,我可以在特定日期执行一些db操作。而且不需要呼叫某人的请求。只是独立。我应该遵循哪种方法? 每个想法都会被愉快地接受。谢谢您应该实现另一个应用程序。您不需要请求,只需执行一些任务,然后这次使用桌面应用程序。若您需要提供UI,那个么使用WPF或Win表单,若只执行一些任务,那个么只使用控制台应用程序。要在特定时间运行它,您可以使用windows任务计划程序。您需要一个外部应用程序,可以是在您的PC/

我有一个非常有趣的问题。我有一个asp.net网站。我需要的是独立的服务,应该总是在后台运行。例如,我可以在特定日期执行一些db操作。而且不需要呼叫某人的请求。只是独立。我应该遵循哪种方法?
每个想法都会被愉快地接受。谢谢

您应该实现另一个应用程序。您不需要请求,只需执行一些任务,然后这次使用桌面应用程序。若您需要提供UI,那个么使用WPF或Win表单,若只执行一些任务,那个么只使用控制台应用程序。要在特定时间运行它,您可以使用windows任务计划程序。

您需要一个外部应用程序,可以是在您的PC/服务器上运行的服务/程序,也可以是在托管提供商的网络上运行的服务/程序。
对于想法,如果您希望您的网站提供日程安排等,windows Azure提供了一个日程安排服务,可以在给定的时间间隔调用网址(例如yourwebsite.com/runscheduler)。当这个网址被调用时,你的网站当然可以通过做一些业务逻辑来处理它。

我建议你看看开源项目

Revalee是一项服务,允许您计划对web应用程序的web回调。在您的例子中,您将计划一个回调,该回调将在特定时间执行特定的数据库操作。Revalee可以很好地处理离散事务操作的任务,比如更新一些数据库值或发送自动电子邮件消息(阅读:不长时间运行)。执行您操作的代码将全部驻留在您的应用程序中

要使用Revalee,您需要:

  • 在服务器上安装Revalee服务,即Windows服务。Windows服务的源代码(您可以自己编译)或预编译版本中都可以找到,这些版本可以在网站上找到

  • 在VisualStudio项目中使用Revalee客户端库。(还有一个特定于MVC的版本。)客户机库可以在源代码中找到(同样,您可以自己编译),也可以在通过提供的预编译版本中找到

  • 当您的代码调用
    scheduledbcoperation()
    方法时,您将注册一个将来的回调(本例假设您需要您的操作从现在开始运行12小时)

  • 当Revalee回拨您的应用程序时,您的应用程序将执行您编写的任何操作。为此,您可以将以下方法调用(
    DbOperation()
    )添加到
    DbOperation.aspx
    页面处理程序中,即la:

    private void DbOperation()
    {
        // TODO Lookup the job information and execute the database operation
        // ...
    
        return;
    }
    
  • 我希望这有帮助

    注意:上面的代码示例使用同步版本的
    ScheduleCallback()
    ,Revalee客户端库还支持异步调用

    RevaleeRegistrar.ScheduleCallbackAsync(callbackTime, callbackUrl);
    
    如果上面不清楚,Revalee服务不是外部第三方在线计划程序服务,而是您在自己的网络上安装并完全控制的Windows服务。它驻留并运行在您自己选择的服务器上,很可能是您的web服务器(但这不是必需的),在那里它可以接收来自ASP.NET应用程序的回调注册请求


    免责声明:我是参与Revalee项目的开发人员之一。不过,要明确的是,Revalee是免费的开源软件。源代码可在上获得。

    您可以将Global.asax文件与timeri一起使用。在项目中,我需要每1分钟调用一个方法,或者您可以创建一个将在服务器上运行的windows服务。如果您只是希望在SQL Server DB中执行计划任务,您可以使用SQL Server代理作业来完成该任务。谢谢你的回答,我想我会实现另一个应用程序
    RevaleeRegistrar.ScheduleCallbackAsync(callbackTime, callbackUrl);