C# 以固定的时间间隔在现场后台执行代码块

C# 以固定的时间间隔在现场后台执行代码块,c#,asp.net,C#,Asp.net,我有一个ASP.NET方法,它从数据库中提取用户数据,并为我正在构建的web应用程序的用户创建登录凭据 var userDataList = new List<UserInfo>(); SqlConnection conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionS

我有一个ASP.NET方法,它从数据库中提取用户数据,并为我正在构建的web应用程序的用户创建登录凭据

    var userDataList = new List<UserInfo>();
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
    try
    {
        //open SQL connection
        conn.Open();
        SqlCommand getSumOfHours = new SqlCommand("SELECT LoginName, Email FROM [User] WHERE Deleted IS NULL", conn);
        //execute command and retrieve primary key from the above insert and assign to variable
        SqlDataReader reader = getSumOfHours.ExecuteReader();
        while (reader.Read())
        {
            userDataList.Add(new UserInfo
            {
                userName = reader.GetString(0),
                email = reader.GetString(1)
            });
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.Write(ex.ToString());
    }
    finally
    {
        conn.Close();
    }

    foreach (var item in userDataList)
    {
        //System.Diagnostics.Debug.WriteLine(item.userName + " " + item.email);
        if (!(Roles.RoleExists("user")))
        {
            Roles.CreateRole("user");
        }
        if (Membership.GetUser(item.userName) == null)
        {
            Membership.CreateUser(item.userName, "password", item.email);
            Roles.AddUserToRole(item.userName, "user");
        }
    }
}
public class UserInfo
{
    public string userName { get; set; }
    public string email { get; set; }
}
var userDataList=newlist();
SqlConnection conn=新的SqlConnection();
conn.ConnectionString=ConfigurationManager.ConnectionString[“应用程序服务”]。ConnectionString;
尝试
{
//打开SQL连接
conn.Open();
SqlCommand getSumOfHours=新的SqlCommand(“选择LoginName,从[用户]发送的电子邮件,其中已删除为空”,conn);
//执行命令并从上面的insert中检索主键并分配给变量
SqlDataReader=getSumofHour.ExecuteReader();
while(reader.Read())
{
添加(新用户信息)
{
用户名=reader.GetString(0),
email=reader.GetString(1)
});
}
}
捕获(例外情况除外)
{
System.Diagnostics.Debug.Write(例如ToString());
}
最后
{
康涅狄格州关闭();
}
foreach(userDataList中的var项)
{
//System.Diagnostics.Debug.WriteLine(item.userName+“”+item.email);
if(!(Roles.RoleExists(“用户”))
{
角色。CreateRole(“用户”);
}
if(Membership.GetUser(item.userName)==null)
{
CreateUser(item.userName,“密码”,item.email);
Roles.AddUserToRole(item.userName,“user”);
}
}
}
公共类用户信息
{
公共字符串用户名{get;set;}
公共字符串电子邮件{get;set;}
}

它工作得很好,但目前我通过按下页面上的按钮来执行它。这并不理想,因为必须有人记住按下按钮才能执行。当站点在服务器上运行时,是否有可能让站点每隔几个小时在后台执行这段代码?

不要为此使用web应用程序。使用计划定期运行的Windows服务或控制台应用程序

Web应用程序被设计为请求/响应系统。他们倾听请求(如按下页面上的按钮),并积极响应这些请求。发送响应后,应用程序将处于空闲状态

此外,如果应用程序大量空闲,主机(web服务器)可以将其关闭,作为管理其资源的一部分。因此,您不能依赖web应用程序始终处于主动运行状态。即使你可以,它仍然需要一个请求才能做任何事情


Windows服务始终在后台运行,并且可以使用
计时器定期执行任务。或者,执行任务的控制台应用程序可以计划定期运行。(例如,通过Windows任务计划程序。)

如果您有权访问服务器,即通过远程桌面访问服务器,则可以使用任务计划程序随时执行代码


如果您没有这种访问权限,即您处于共享主机设置中,大多数大型主机(例如discountasp.net),为您提供按特定计划加载页面的功能-在该场景中,这是最简单的方法。

将其设置为控制台应用程序并设置SQL作业或Windows任务。好的,可以。可以在控制台应用程序中与System.Web.Security及其成员api交互?@DavidTunnell:可以加载该名称空间,但Web应用程序的上下文不在其中。您需要如何处理该名称空间?控制台应用程序不应作为web用户进行身份验证。我正在使用它为web创建用户凭据application@DavidTunnell:这绝对是一个不常见的用例。尽管这是可能的,但只要包含程序集并且配置文件包含它在web应用程序中所包含的内容。作为备用方案,我认为您可以让console应用程序手动将用户数据插入数据库,绕过为您执行此操作的成员资格对象。@David不是输入成员资格所需的全部吗?只要他的控制台应用程序可以连接到数据库,就不会有任何问题。