Rhythm.Staticize.ResourcesDownloadBaseBehavior.Process C# (CSharp) Method

Process() public method

public Process ( HtmlAgilityPack document, HtmlStaticizeContext context ) : void
document HtmlAgilityPack
context HtmlStaticizeContext
return void
        public void Process(HtmlAgilityPack.HtmlDocument document, HtmlStaticizeContext context)
        {
            Uri documentUri = context.Uri;
            String baseUrl = documentUri.GetParent();// GetParent(documentUri);

            var htmlNode = document.DocumentNode;
            var nodes = htmlNode.SelectNodes(resourcesNodeSelectPath);
            if (nodes == null || nodes.Count == 0)
            {
                return;
            }
            var srcAttributes = GetSrcAttributes(nodes);
            if (srcAttributes == null || srcAttributes.Count() == 0)
            {
                return;
            }
            var parsedSrcUris = ParseResourcesUris(documentUri, baseUrl, srcAttributes);
            if (parsedSrcUris == null || parsedSrcUris.Length == 0)
            {
                return;
            }

            OnResourceParsed(parsedSrcUris, context);

            for (int i = 0; i < parsedSrcUris.Length; i++)
            {
                var uri = parsedSrcUris[i];
                String localPath = fileReslover.ResloveLocalPath(uri);
                if (String.IsNullOrEmpty(localPath))
                {
                    continue;
                }
                var localDirectory = System.IO.Path.Combine(outputDirectory, System.IO.Path.GetDirectoryName(localPath));
                if (!directories.ContainsKey(localDirectory) && !System.IO.Directory.Exists(localDirectory))
                {
                    System.IO.Directory.CreateDirectory(localDirectory);
                    //并发 patch
                    try
                    {
                        directories.Add(localDirectory, null);
                    }
                    catch (Exception)
                    {
                    }
                }

                String saveFile = System.IO.Path.Combine(outputDirectory, localPath);
                //并发 patch
                try
                {
                    //已存在相同文件,则跳过。为避免并发写同一个文件。
                    if (files.ContainsKey(saveFile))
                    {
                        continue;
                    }
                    files.Add(saveFile, null);
                }
                catch (Exception)
                {
                }
                if (System.IO.File.Exists(saveFile))
                {
                    continue;
                }
                if (this.fileReslover.TryCopyFromLocal(uri, saveFile))
                {
                    continue;
                }
                using (System.Net.WebClient wc = new System.Net.WebClient())
                {
                    try
                    {
                        wc.DownloadFile(uri, saveFile);
                    }
                    catch (Exception ex)
                    {
                        //修复WebClient 文件不存在仍然本地保存了一个空文件
                        System.IO.File.Delete(saveFile);
                        context.Errors.Add(new ResourcesDownloadException(String.Format(@"下载资源 ""{0}"" 时发生异常。", uri.ToString()), ex)
                        {
                            Url = uri,
                        });
                        continue;
                    }
                }
            }
        }