/// <summary> /// 执行静态化 /// </summary> /// <param name="pages">要静态化的页面列表。Key为页面绝对URL,Value为这个页面保存在本地的路径。URL和Value必须是唯一的。</param> /// <param name="stepTaken">静态化状态,默认请传入此实例,它提供对异步线程获取静态化状态的支持。</param> /// <returns>静态化状态,与传入的 stepTaken 引用一致。</returns> public StaticizeStepStatus Staticize(IEnumerable<KeyValuePair<Uri, String>> pages, StaticizeStepStatus stepTaken) { if (pages == null) { throw new ArgumentNullException("pages"); } if (stepTaken == null) { throw new ArgumentNullException("stepTaken"); } #region 初始化 stepTaken.Step = StaticizeStep.Initialize; int pageCount = pages.Count(); stepTaken.pageCount = pageCount; // 创建 Context 对象,每个页面一个 Context HtmlStaticizeContext[] entries = new HtmlStaticizeContext[pageCount]; { int i = 0; foreach (var address in pages) { entries[i] = new HtmlStaticizeContext { uri = address.Key, fileName = address.Value, }; i++; } } stepTaken.Init(entries); AddValidation(GenerationSuccessfulValidation.Instance); #endregion stepTaken.Step = StaticizeStep.GenerationHtml; // 生成 HTML Generate(entries, stepTaken); stepTaken.Step = StaticizeStep.GenerationHtmlCompleted; #region 验证 stepTaken.Step = StaticizeStep.Validation; if ( (m_Behaviors != null && m_Behaviors.Count > 0) || (m_Validations != null && m_Validations.Count > 0) ) { for (int j = 0; j < entries.Length; j++) { var entry = entries[j]; // 如果 generationError 不为null,表示 HTML 生成失败。 if (entry.generationError != null) { var ex = entry.generationError; var vd = new ValidationResult() { ValidationType = ValidationType.Tag, Uri = entry.uri, Name = "页面HTML是否成功生成。", Message = string.Format("生成HTML期间发生错误:{0}\r\n{1}\r\n", ex.Message, ex.ToString()), Exception = ex, }; entry.validationResults = new ValidationResult[] { vd }; stepTaken.ValidationErrors.Add(vd); stepTaken.validatedPageCount++; continue; } // load document dom var doc = new HtmlAgilityPack.HtmlDocument(); // 尝试加载 document try { doc.Load(entry.fileName, System.Text.Encoding.UTF8); } catch (Exception ex) { // 加载 document失败 entry.DocumentLoadError = ex; var vd = new ValidationResult() { ValidationType = ValidationType.Tag, Uri = entry.uri, Name = "页面HTML是否成功生成。", Message = string.Format("加载HTML文档树期间发生错误:{0}\r\n{1}\r\n", ex.Message, ex.ToString()), Exception = ex, }; entry.validationResults = new ValidationResult[] { vd }; stepTaken.ValidationErrors.Add(vd); stepTaken.AddValidatedPageCount(); continue; } if (m_Behaviors != null && m_Behaviors.Count > 0) { for (int k = 0; k < m_Behaviors.Count; k++) { m_Behaviors[k].Process(doc, entry); } } if (m_Validations != null && m_Validations.Count > 0) { Validate(doc, entry, stepTaken); } stepTaken.AddValidatedPageCount(); } } stepTaken.Step = StaticizeStep.ValidationCompleted; #endregion // add context errors results to status { var all = stepTaken.Errors; for (int i = 0; i < entries.Length; i++) { var items = entries[i].Errors; if (items != null && items.Count > 0) { all.AddRange(items); } } } stepTaken.Step = StaticizeStep.Completed; return stepTaken; }