Захват всех запросов с помощью FiddlerCore

Я пытаюсь отслеживать трафик с помощью FiddlerCore и контроллера WebBrowser. Ниже приведен код для захвата веб-запросов в С#

    private void button1_Click(object sender, EventArgs e)
    {
       List<Fiddler.Session> oAllSessions = new List<Fiddler.Session>();
       URLMonInterop.SetProxyInProcess("127.0.0.1:8888", "<-loopback>");
        webBrowser1.ScriptErrorsSuppressed = true;
        WebProxy myProxy = new WebProxy();
        Uri newUri = new Uri("http://localhost:8888");
        myProxy.Address = newUri;


        Fiddler.FiddlerApplication.Startup(8888, FiddlerCoreStartupFlags.Default);
        Fiddler.FiddlerApplication.AfterSessionComplete += delegate(Fiddler.Session oS)
        {
                Monitor.Enter(oAllSessions);
                oAllSessions.Add(oS);
                Monitor.Exit(oAllSessions);

        };

        webBrowser1.Navigate("http://www.test.com/");
        while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
        {
            System.Windows.Forms.Application.DoEvents();
        }

        var message = string.Join(Environment.NewLine, oAllSessions);
        textBox1.Text = textBox1.Text  + message;
        Fiddler.FiddlerApplication.Shutdown();
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        Fiddler.FiddlerApplication.Shutdown();
        URLMonInterop.ResetProxyInProcessToDefault();
    }

Он возвращает только один ответ на запрос (данный URL-адрес в webBroser.Navigate), я не вижу запросов на изображения, css и другие загруженные файлы на примере сайта. Я не смог найти никакой информации об этом. Может ли кто-нибудь помочь мне понять, как я могу перехватывать все запросы GET POST, когда webBroswer.Navigate по указанному URL-адресу?

обновлено:

  delegate void updateUI();
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Fiddler.FiddlerApplication.AfterSessionComplete += FiddlerApplication_AfterSessionComplete;
        Fiddler.FiddlerApplication.Startup(8888, FiddlerCoreStartupFlags.Default);

        webBrowser1.ScriptErrorsSuppressed = true;
        WebProxy myProxy = new WebProxy();
        Uri newUri = new Uri("http://localhost:8888");
        myProxy.Address = newUri;

        string[] urls = new string[] { "http://localhost/test/page1", 
                                       "http://localhost/test/page2 " 
                                };

        foreach (string url in urls)
        {
            webBrowser1.Navigate(url);
            // Capture root url
            listBox1.Invoke(new updateUI(() =>
            {
                listBox1.Items.Add(url);
            }));
            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            {
                System.Windows.Forms.Application.DoEvents();
            }
            // Hack as I am not sure what to do here so wait 10 second for webBrowser to load all requests otherwise I only get last url data in listbox
            for (int i = 0; i <= 10; i++)
            {
                System.Windows.Forms.Application.DoEvents();
                Thread.Sleep(1000);
            }

        }
    }

    void FiddlerApplication_AfterSessionComplete(Session oSession)
    {
        var regex = new Regex("keywords-in-url-to-match");

        // If my desired keyword match then grab request POST body
        if (regex.IsMatch(oSession.fullUrl.ToString()))
        {
            string requestBody = oSession.GetRequestBodyAsString();

            // Capture url and request body. This url is not root url
            listBox1.Invoke(new updateUI(() =>
            {
                 listBox1.Items.Add(oSession.fullUrl); 
                listBox1.Items.Add(System.Web.HttpUtility.UrlDecode(requestBody)); 
            }));
        }
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        Fiddler.FiddlerApplication.Shutdown();
    }

person user969068    schedule 26.02.2014    source источник


Ответы (1)


  1. Что заставляет вас думать, что другие элементы не извлекаются из кеша?
  2. Вы не должны использовать FiddlerCoreStartupFlags.Default, если собираетесь использовать SetProxyInProcess; первый устанавливает прокси для каждого процесса в системе, а второй устанавливает прокси только для текущего процесса.
person EricLaw    schedule 26.02.2014
comment
Спасибо за ответ, сэр, я действительно читал ваши сообщения в блоге и, наконец, понял проблему. Я забыл установить таймер для обновления сеансов запросов. - person user969068; 27.02.2014
comment
Другими словами, реальная проблема заключается в том, что вы пытаетесь обновить пользовательский интерфейс из фонового потока. Вам нужно использовать BeginInvoke для маршалинга обновлений пользовательского интерфейса из фонового потока в поток пользовательского интерфейса. - person EricLaw; 27.02.2014
comment
Большое спасибо, я последовал вашему совету и придумал выше обновленный код. Я очень новичок в Csharp, но очень стараюсь узнать больше. Еще раз спасибо за такую ​​замечательную библиотеку FiddlerCore. - person user969068; 28.02.2014