C#利用定时任务插件实现在后台线程中批量把动态文件生成静态文件方法
来源:互联网 发布:js 自动触发点击事件 编辑:程序博客网 时间:2024/05/08 07:05
global.asax实现:”
static QuartzWorker worker;protected void Application_Start(Object sender, EventArgs e){ worker = new QuartzWorker();NewsUpdateWork newsWork = new NewsUpdateWork(); worker.AddWork(newsWork); worker.Start(); }
protected void Application_End(Object sender, EventArgs e){//在应用程序关闭时运行的代码if (worker != null){worker.Stop();}}
NewsUpdateWork.cs实现:
public class NewsUpdateWork : QuartzJob { public NewsUpdateWork() { //CronExpression = "0 0/1 * * * ?"; //每天21点-24点,0点-7点,每隔5分钟执行一次 //CronExpression = "0 0/5 18-23,0-9 * * ?"; CronExpression = "0 0/5 * * * ?"; RepeatInterval = new TimeSpan(0, 0, 0); RepeatCount = 0; DoWork += new EventHandler(this_DoWork); } public void this_DoWork(object sender, EventArgs e) { News news = new News(); news.BatCreateNewsHtml(); } }
BatCreateNewsHtml方法:
/// <summary> /// 批量创建网页 /// </summary> public void BatCreateNewsHtml() { //循环更新设置为还未生成静态新闻的新闻,一次生成200条新闻。每5分钟执行一次 DataTable dt = facade.GetNewsIdList(); for (int i = 0; i < dt.Rows.Count; i++) { try { int id = Convert.ToInt32(dt.Rows[i]["news_id"].ToString()); //EventLog.WriteLog("生成开始" + id.ToString()); //生成静态文件 CreateHtml(id); //更新静态文件是否更新字段为1,表示静态文件已经重新生成 UpdateIsUpdate(id); //EventLog.WriteLog("生成结束" + id.ToString()); } catch (Exception ex) { EventLog.WriteLog(ex.Source + "\n" + ex.Message + "\n" + ex.StackTrace); return; } } }
CreateHtml方法的实现:
public void CreateHtml(int id) { string oldfile; string newfile; DataTable dt = facade.GetNewsTypeList(id); if (dt.Rows.Count <= 0) { return; } switch (dt.Rows[0]["News_type"].ToString()) { case "10": oldfile = ApplicationSettings.Get("WebDomain") + "/newshtml/showcy.asp?rec=" + id.ToString(); newfile = "/newshtml/" + dt.Rows[0]["htmlurl"].ToString(); CreateFile.CreateHtml(oldfile, newfile); break; //如果是法律法规标签,不生成静态文件 case "5": case "88": //do nothing break; default: oldfile = ApplicationSettings.Get("WebDomain") + "/newshtml/shownews.asp?rec=" + id.ToString(); newfile = "/newshtml/" + dt.Rows[0]["htmlurl"].ToString(); CreateFile.CreateHtml(oldfile, newfile); break; } }
CreateFile.CreateHtml方法实现:
public static void CreateHtml(string webUrl, string htmlPath) { CreateHtml(webUrl, htmlPath, Encoding.GetEncoding("gb2312")); } public static void CreateHtml(string webUrl, string htmlPath, Encoding encoding) { CreateHtml(webUrl, htmlPath, encoding, encoding); }public static void CreateHtml(string webUrl, string htmlPath, Encoding readEncoding, Encoding writeEncoding) { string newPageHtml = ""; //虚拟路径 string PageUrl = ""; newPageHtml = TextUtility.GetRealPath(htmlPath); //EventLog.WriteLog(newPageHtml); PageUrl = webUrl; try { WebRequest request = WebRequest.Create(webUrl); WebResponse response = request.GetResponse(); using (Stream stream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(stream, readEncoding)) { //从动态文件中读取html代码 string tem = reader.ReadToEnd(); string physicalPath = newPageHtml; FileManager.CreateFolder(physicalPath); //如果文件不存在,则创建 if (!FileManager.Exists(physicalPath, FsoMethod.File)) { FileManager.Create(physicalPath, FsoMethod.File); } //把读取的内容写入相应的html文件 FileManager.WriteFile(physicalPath, tem, writeEncoding); } } } catch (Exception e) { //捕获异常后的处理代码 EventLog.WriteLog(e.Source + "\n" + e.Message + "\n" + e.StackTrace); return; } }获取真实路径方法:
public static string GetRealPath( string strPath ) { if ( string.IsNullOrEmpty( strPath ) ) { throw new Exception( "strPath 不能为空!" ); } HttpContext current = null; try { current = HttpContext.Current; } catch { current = null; } if ( current != null ) { return current.Server.MapPath( strPath ); } string str2 = Path.Combine( strPath , "" ); str2 = str2.StartsWith( @"\\" ) ? str2.Remove( 0 , 2 ) : str2; return ( AppDomain.CurrentDomain.BaseDirectory + Path.Combine( strPath , "" ) ); }
FileManager类中的三个方法:/// <summary> /// 检查目录并创建,如果目录不存在则创建,可创建多个目录 /// </summary> /// <param name="path">物理路径</param> public static void CreateFolder(string physicsPath) { //如果路径中有文件名,则去除,因为不去除则文件名也会创建为一个文件夹 if (GetFileName(physicsPath).IsNotNullAndEmpty()) { physicsPath = physicsPath.Replace(GetFileName(physicsPath), ""); } string folder = ""; string[] arry = physicsPath.Split('\\'); for (int i = 0; i < arry.Length; i++) { folder += arry[i] + "\\"; if (!Directory.Exists(folder)) Directory.CreateDirectory(folder); } }/// <summary> /// 新建单个文件或文件夹 /// </summary> /// <param name="file">文件或文件夹及其路径</param> /// <param name="method">新建方式</param> public static void Create(string file, FsoMethod method) { try { if (method == FsoMethod.File) { WriteFile(file, ""); } else if (method == FsoMethod.Folder) { Directory.CreateDirectory(file); } } catch (Exception exception) { throw new Exception(exception.ToString()); } }/// <summary> /// 以文件流的形式将内容写入到指定文件中(如果该文件或文件夹不存在则创建) /// 默认是带签名的 UTF8 /// </summary> /// <param name="file">文件名和指定路径</param> /// <param name="fileContent">文件内容</param> /// <param name="encoding">文件编码 缺省 UTF-8</param> public static void WriteFile(string file, string fileContent, Encoding encoding) { FileInfo info = new FileInfo(file); if (!Directory.Exists(info.DirectoryName)) { Directory.CreateDirectory(info.DirectoryName); } FileStream stream = new FileStream(file, FileMode.Create, FileAccess.Write); StreamWriter writer = new StreamWriter(stream, encoding); try { writer.Write(fileContent); } catch (Exception exception) { throw new Exception(exception.ToString()); } finally { writer.Flush(); stream.Flush(); writer.Close(); stream.Close(); } }
阅读全文
0 0
- C#利用定时任务插件实现在后台线程中批量把动态文件生成静态文件方法
- c#在后台文件中对html元素设置样式
- phpcms中当在后台发布文章提示文件不可写,后台生成不了静态页时
- Android在后台线程实现 定时更新时间
- 把任务放在后台运行
- PHP中实现生成静态文件之简单方法一
- 利用windows计划任务实现定时运行ASP文件代码
- 利用windows计划任务实现定时运行ASP文件代码
- IIS无法在后台生成WORD文件的故障
- Asp.net_关于如何利用编译器把[.cs]文件生成动态链接库[.dll]文件方法的总结
- NodeJs利用fs模块,实现批量生成文件
- excel中如何利用VBA批量生成XML文件
- 利用freemarker生成静态文件
- Android---长时间在后台运行的定时任务
- php读取动态页面生成静态html文件的方法
- 在后台线程中执行数据库查询
- c#静态文件生成,续
- 利用Resgen.exe 批量生成resources文件
- 锤子剪刀布
- 字符串的定义 String类创建的对象
- C Primr Plus 笔记整理
- javascript原型
- fatfs 学习笔记--f_mount用法
- C#利用定时任务插件实现在后台线程中批量把动态文件生成静态文件方法
- js中json和String字符串之间的相互转化
- SlidingMenu的使用
- 子类与父类构造函数顺序,包括静态变量
- SSM框架集成整合(Spring+SpringMVC+mybatis)
- 动态规划--hdu1241搬寝室
- [Lintcode]三数之和
- 2017_7_12 CSS基础
- C#编程入门_表达式和运算符_3