C# 以固定的时间间隔在现场后台执行代码块
我有一个ASP.NET方法,它从数据库中提取用户数据,并为我正在构建的web应用程序的用户创建登录凭据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
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不是输入成员资格所需的全部吗?只要他的控制台应用程序可以连接到数据库,就不会有任何问题。