Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
C# 作为网络服务运行WinForms WebBrowser控件_C#_Asp.net_Webbrowser Control - Fatal编程技术网

C# 作为网络服务运行WinForms WebBrowser控件

C# 作为网络服务运行WinForms WebBrowser控件,c#,asp.net,webbrowser-control,C#,Asp.net,Webbrowser Control,我需要在ASP.NET应用程序中使用WinForms WebBrowser控件,以便拍摄网页截图 我更愿意在控制台应用程序中运行它,并通过ASP.NET应用程序与应用程序通信,但这不是我的电话,我被告知它必须作为网站的一部分运行 除了每次调用navigate以新会话重新开始外,这一切都非常有效,就像cookies没有被持久化一样。作为一个实验,我将我的IIS应用程序池改为以我的身份运行,而不是以网络服务的身份运行,并且一切正常。所以它作为网络服务运行有些奇怪 我猜网络服务帐户没有跟踪ASP.NE

我需要在ASP.NET应用程序中使用WinForms WebBrowser控件,以便拍摄网页截图

我更愿意在控制台应用程序中运行它,并通过ASP.NET应用程序与应用程序通信,但这不是我的电话,我被告知它必须作为网站的一部分运行

除了每次调用navigate以新会话重新开始外,这一切都非常有效,就像cookies没有被持久化一样。作为一个实验,我将我的IIS应用程序池改为以我的身份运行,而不是以网络服务的身份运行,并且一切正常。所以它作为网络服务运行有些奇怪

我猜网络服务帐户没有跟踪ASP.NET_会话ID cookie和auth cookie的权限,但这两个都是非持久性cookie,所以我不知道为什么会这样

下面是一些简化的代码,您可以了解我所做工作的要点。我剪切的图像有很多日志记录和存储,所以这不是完整的代码。基本上,开发人员/测试人员/管理员可以运行此代码一次(任务通过网页启动),它将生成系统中每个页面的位图,他们可以发布网站的新版本,然后再次运行,它将告诉您差异(新页面、删除的页面、更改的页面)

总而言之:

  • 上面的代码由ASP.NET页面启动,并在后台运行
  • 如果我在IIS应用程序池中运行它,并将其设置为以适当的用户身份运行,则效果良好
  • 如果我在IIS应用程序池中作为网络服务运行它,那么每个导航都有一个新的会话,而不是在WebBrowser的生命周期中保持一个会话
  • 我可以让它在ASP.NET之外正常工作,但这不是我目前的选择,它必须在这个ASP.NET应用程序中运行
//更新


根据我同事的建议,我正在创建WebBrowser的后台线程中使用模拟,作为本地用户运行。这很好,我对这个解决方案很满意。他是stackoverflow用户,所以我会让他发布答案并获得积分:)

您在来自WebBrowser控件的请求中看到会话cookie了吗?我找不到关于此控件应该如何处理cookie的任何信息-如果它忽略cookie,您将得到您正在描述的行为

在后台线程中使用模拟将允许WebBrowser作为具有运行IE权限的用户运行,从而存储cookie,而不是作为应用程序池用户运行(网络服务)


您可以在或中设置模拟以将其限制到特定线程。

由于使用WinInet,因此不受特别支持。有关WinInet在服务中的限制,请参阅。

我看不到WebBrowser属性在工作情况下与不工作情况下的任何差异。我认为该控件基本上是运行的s IE,因此阻止Cookie工作是一些权限问题,这是有道理的。根据我同事的建议,我将尝试在线程中模拟,以使其作为本地用户运行。我的世界现在更好了。感谢链接,这很好地解释了这一点。你能分享你开始和停止模拟的确切位置吗n?我已经让它工作了(Environment.UserName返回预期值),但浏览器仍然无法持久保存cookies。如果相反,我将应用程序池设置为以同一用户的身份运行,它工作正常。。。
public void Run()
{
    var t = new Thread(RunThread);
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
}

private void RunThread()
{
    try
    {
        using (var browser = new WebBrowser())
        {
            browser.DocumentCompleted += BrowserDocumentCompleted;

            if (!VisitPage(browser, "special page that sets some session flags for testing - makes content predictable")))
                throw new TestRunException("Unable to disable randomness");

            foreach (var page in pages)
            {
                VisitPage(browser, page);
            }
        }
    }
    // An unhandled exception in a background thread in ASP.NET causes the app to be recycled, so catch everything here
    catch (Exception)
    {
        Status = TestStatus.Aborted;
    }
}

private bool VisitPage(WebBrowser browser, string page)
{
    finishedEvent.Reset();

    var timeout = false;
    stopwatch = new Stopwatch();

    browser.Navigate(page);

    stopwatch.Start();

    while (!timeout && !finishedEvent.WaitOne(0))
    {
        Application.DoEvents();
        if (stopwatch.ElapsedMilliseconds > 10000)
            timeout = true;
    }
    Application.DoEvents();

    if (timeout)
    {
        if (resource != null)
            ShopData.Shop.LogPageCrawlTestLine(testRunID, resource, sequence++, (int)stopwatch.ElapsedMilliseconds, null);
    }

    browser.Stop();

    return !timeout;
}

private void BrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    try
    {
        var browser = (WebBrowser)sender;

        var width = browser.Document.Body.ScrollRectangle.Width;
        var height = browser.Document.Body.ScrollRectangle.Height;
        var timeTaken = (int)stopwatch.ElapsedMilliseconds;

        if ((width == 0) || (height == 0))
        {
            return;
        }

        browser.Width = width;
        browser.Height = height;

        byte[] buffer;

        using (var bitmap = new Bitmap(width, height))
        using (var memoryStream = new MemoryStream())
        {
            browser.DrawToBitmap(bitmap, new Rectangle(0, 0, width, height));
            bitmap.Save(memoryStream, ImageFormat.Bmp);
            buffer = memoryStream.ToArray();
        }
        // stores image

    }
    finally
    {
        finishedEvent.Set();
    }
}