Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何使用MVC拍摄网站截图?_Asp.net Mvc_Screenshot - Fatal编程技术网

Asp.net mvc 如何使用MVC拍摄网站截图?

Asp.net mvc 如何使用MVC拍摄网站截图?,asp.net-mvc,screenshot,Asp.net Mvc,Screenshot,我正在努力寻找一种方法,用MVC4拍摄一个网站的截图。我看到了两种可能的解决方案,它们对MVC都不起作用 第一个是使用WebBrowser,教程发现,但这给了我一个ActiveX控件“8856f961-340a-11d0-a96b-00c04fd705a2”无法实例化,因为当前线程不在单线程单元中错误 另一个是使用名为的第三方,但我还没有找到将其集成到MVC中的方法 还有其他想法/解决方案吗 谢谢。为什么要将其集成到MVC中?您的网站是否有责任拍摄其他网站的截图?我会选择在单独的库中创建截图逻辑

我正在努力寻找一种方法,用MVC4拍摄一个网站的截图。我看到了两种可能的解决方案,它们对MVC都不起作用

第一个是使用WebBrowser,教程发现,但这给了我一个
ActiveX控件“8856f961-340a-11d0-a96b-00c04fd705a2”无法实例化,因为当前线程不在单线程单元中
错误

另一个是使用名为的第三方,但我还没有找到将其集成到MVC中的方法

还有其他想法/解决方案吗

谢谢。

为什么要将其集成到MVC中?您的网站是否有责任拍摄其他网站的截图?我会选择在单独的库中创建截图逻辑,例如作为Windows服务托管

WebBrowser
控件需要在UI线程上运行,而服务(如IIS)没有UI线程。不过,您可以尝试其他库


例如,您可以编写一些代码,使用WebKit引擎将HTML呈现为PDF(顾名思义)。

如果您有更多详细信息,您应该可以使用任意数量的工具来完成这项工作。CodeCaster的想法很好,PhantomJS还提供了类似的基于webkit的任意url()图像生成。它提供了多种输出格式选项,如PNG、JPG、GIF和PDF

因为PhantomJS使用的是WebKit,一个真正的布局和渲染引擎,所以它可以捕获网页作为屏幕截图。因为PhantomJS可以在网页上呈现任何内容,所以它不仅可以用于转换HTML和CSS中的内容,还可以转换SVG和画布中的内容


您需要从MVC应用程序中执行phantomjs.exe应用程序,或者通过后台运行的某个服务更好地处理提交的URL队列。

您需要指定线程处于STA(单线程单元模式,以便实例化web浏览器)


您可以使用的另一个库是。@happygilmore,它不能回答我的问题。拍摄一个网站的截图听起来不像是一个网站本身应该做的事情。单一责任。再看看其他的评论,我不确定我是否理解你的问题。我需要保存人们提交给我的网站截图。我不确定javascript是否能帮我做到这一点。点击链接,阅读,学习。ASP.NET MVC中没有内置的web浏览器,因此无法下载和呈现其他网页。您需要一个模拟浏览器的库,其中一些库可能不是用C语言编写的。如果(我一直强调的是)您没有将截图功能构建到MVC网站中,而是构建在一个单独的应用程序中,那么这并不重要。然后,你的网站可以将用户的URL提供给该应用程序,该应用程序会截图并再次通知你的网站。我理解你现在所说的。当你说“单独应用程序”时,你能说得更具体些吗?我不明白你对@CodeCaster回答的评论是什么意思。你说的“需要保存人们提交给我的网站截图”是什么意思?也许我需要更详细地解释我想要什么。我主持的网站目录,其他人提交给我。首先,我需要一些服务器端代码进行验证,我想在列出url时保存并显示缩略图的图像以及url。因此,用户将向您提交url,然后您希望您的应用程序(在某台服务器上运行)以某种方式将该url加载到虚拟浏览器并截图?这是最初的想法,但如果其他解决方案有效的话,我愿意使用它们:-)因为我使用的是共享主机,所以我不能运行PhantomJS,所以我正在寻找其他的选择。当我找到最好的解决方案时,我会通知这个帖子。谢谢你。
public ActionResult Save()
{
    var url = "http://www.google.co.uk";

    FileContentResult result = null;
    Bitmap bitmap = null;

    var thread = new Thread(
    () =>
    {
        bitmap = ExportUrlToImage(url, 1280, 1024);
    });

    thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
    thread.Start();
    thread.Join();

    if (bitmap != null)
    {
        using (var memstream = new MemoryStream())
        {
            bitmap.Save(memstream, ImageFormat.Jpeg);
            result = this.File(memstream.GetBuffer(), "image/jpeg");
        }
    }

    return result;
}

private Bitmap ExportUrlToImage(string url, int width, int height)
{
    // Load the webpage into a WebBrowser control
    WebBrowser wb = new WebBrowser();
    wb.ScrollBarsEnabled = false;
    wb.ScriptErrorsSuppressed = true;

    wb.Navigate(url);
    while (wb.ReadyState != WebBrowserReadyState.Complete)
    {
            Application.DoEvents();
    }

    // Set the size of the WebBrowser control
    wb.Width = width;
    wb.Height = height;

    Bitmap bitmap = new Bitmap(wb.Width, wb.Height);
    wb.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, wb.Width, wb.Height));
    wb.Dispose();

    return bitmap;
}