在果园cms模块中使用Awesomium

时间:2014-12-03 19:26:44

标签: c# asp.net-mvc orchardcms awesomium

我正在尝试编写一个果园模块,它将从预定义的URL(javascript执行)中获取一些HTML页面,从中提取一些HTML。我最终得到了Awesomium浏览器engine.as Awesomium打算在一个线程中运行,我创建了一个SingletonDependency和一个线程,它将在模块处于活动状态时继续运行。远远没有任何问题和程序在本地机器上工作正常。但是当我在服务器上部署模块时,Awesomium documentReady事件永远不会被触发。我已经在测试ASP.NET mvc应用程序中测试了库(Awesomium)并且它按预期工作。 以下是我到目前为止所做的一些代码片段:

public class DownloadService : IDownloadService
{
    private Thread downloaderThread;
    const int MillisecondsTimeout = 30000;
    private List<DownloadQueueItem> downloadQueue = new System.Collections.Generic.List<DownloadQueueItem>();

    private void DoDownloadTask()
    {
        while (true)
        {
            if (downloadQueue.Any())
            {
                var itemToDownload = downloadQueue.FirstOrDefault(qi => qi.IsCompleted == false);
                if (itemToDownload != null)
                {
                    var webPreferences = WebPreferences.Default;
                    using (var session = WebCore.CreateWebSession(webPreferences))
                    {
                        using (var view = WebCore.CreateWebView(800, 600, session))
                        {                                  
                            view.Source = new Uri(itemToDownload.Url, UriKind.Absolute);
                            bool finishedLoading = false;
                            bool isReady = false;

                            view.LoadingFrameComplete += (s, e) =>
                            {
                                if (e.IsMainFrame)
                                    finishedLoading = true;
                            };

                            view.DocumentReady += (s, e) =>
                            {
                                isReady = true;
                            };

                            int timeSpent = 0;
                            while (!finishedLoading || !isReady)
                            {
                                Thread.Sleep(500);
                                WebCore.Update();
                                timeSpent += 500;
                                if (timeSpent > MillisecondsTimeout)
                                {
                                    isReady = true;
                                    finishedLoading = true;
                                    itemToDownload.Result = "";
                                }
                            }

                            if (timeSpent < MillisecondsTimeout)
                            {
                                itemToDownload.Result = view.ExecuteJavascriptWithResult("document.getElementsByTagName('html')[0].outerHTML");                                        
                            }
                            itemToDownload.IsCompleted = true;
                        }
                    }
                }
            }

            downloadQueue = downloadQueue.Where(qi => !qi.IsProcessed).ToList();

            Thread.Sleep(500);
        }
    }
}

更新

场景:我正在尝试设置一个无限循环来检查特定时间间隔内的更新并下载一些HTML页面并使用特定选择器在其中搜索特殊标记(在我的情况下通过CsQuery)然后初始化parts的{​​{1}}和fields(关于我之前定义的Bindings规则)和他们的内容。我再次提到“一切都在本地机器上工作正常”。 Here是来自this问题的ASP.NET MVC应用程序中Awesomium引擎的工作示例。我的代码类似于提供的示例。在该示例中,IHttpModule用于执行下载任务但在我的案例是从ISingletonDependency驱动的一个类。

更新2

经过几个小时的调试后我终于找出问题所在。问题是Awesomium.Core dll有依赖关系,asp.net服务器将它们复制到以下目录:

ContentItem
在orchard依赖项中的

自动复制到Dependencies文件夹但不是任何类型的文件(我认为只有dll)。在我的场景中有一个名为"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\root\\8b7dd3d5\\5e9b4019\\assembly\\dl3\\788672a2\\001db261_934ccf01" 的文件,果园无法将此文件复制到依赖项文件夹。这就是确切的问题。

更新3

我手动添加了这些文件,一切都像魅力一样。但我仍然是一个以编程方式复制它们的解决方案。

0 个答案:

没有答案