استفاده از Awesomium.NET در برنامههای وب
نویسنده: وحید نصیری
تاریخ: ۱۳۹۲/۱۱/۱۵ ۱۵:۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
try
{
using (WebSession mywebsession = WebCore.CreateWebSession(
new WebPreferences() { CustomCSS = "::-webkit-scrollbar { visibility: hidden; }" }))
{
using (var view = WebCore.CreateWebView(1240, 1000, mywebsession))
{
view.Source = new Uri("https://site.com/");
bool finishedLoading = false;
view.LoadingFrameComplete += (s, e) =>
{
if (e.IsMainFrame)
finishedLoading = true;
};
while (!finishedLoading)
{
Thread.Sleep(100);
WebCore.Update();
}
using (var surface = (BitmapSurface)view.Surface)
{
surface.SaveToJPEG("result.jpg");
}
}
}
}
finally
{
WebCore.Shutdown();
} System.InvalidOperationException: You are attempting to re-initialize the WebCore. The WebCore must only be initialized once per process and must be shut down only when the process exits.
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. at Awesomium.Core.NativeMethods.WebCore_CreateWebView_1(HandleRef jarg1, Int32 jarg2, Int32 jarg3, HandleRef jarg4)
using System;
using System.Collections.Concurrent;
using System.IO;
using System.Threading;
using System.Web;
using Awesomium.Core;
namespace AwesomiumWebModule
{
public class AwesomiumModule : IHttpModule
{
private static readonly Thread WorkerThread = new Thread(awesomiumWorker);
private static readonly ConcurrentQueue<AwesomiumRequest> TaskQueue = new ConcurrentQueue<AwesomiumRequest>();
private static bool _isRunning = true;
static AwesomiumModule()
{
WorkerThread.Start();
}
private static void awesomiumWorker()
{
while (_isRunning)
{
if (TaskQueue.Count != 0)
{
AwesomiumRequest outRequest;
if (TaskQueue.TryDequeue(out outRequest))
{
var img = AwesomiumThumbnail.FetchWebPageThumbnail(outRequest);
File.WriteAllBytes(outRequest.SavePath, img);
Thread.Sleep(500);
}
}
Thread.Sleep(5);
}
}
public void Dispose()
{
_isRunning = false;
WebCore.Shutdown();
}
public void Init(HttpApplication context)
{
context.EndRequest += endRequest;
}
static void endRequest(object sender, EventArgs e)
{
var url = HttpContext.Current.Items[Constants.AwesomiumRequest] as AwesomiumRequest;
if (url!=null)
{
TaskQueue.Enqueue(url);
}
}
}
} <?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpModules>
<add name="AwesomiumWebModule" type="AwesomiumWebModule.AwesomiumModule"/>
</httpModules>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<add name="AwesomiumWebModule" type="AwesomiumWebModule.AwesomiumModule"/>
</modules>
</system.webServer>
</configuration> protected void btnStart_Click(object sender, EventArgs e)
{
var host = new Uri(txtUrl.Text).Host;
HttpContext.Current.Items.Add(Constants.AwesomiumRequest, new AwesomiumRequest
{
Url = txtUrl.Text,
SavePath = Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data\\Thumbnails\\" + host + ".jpg"),
TempDir = Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data\\Temp")
});
lblInfo.Text = "Please wait. Your request will be served shortly.";
}