0

WebBrowserコントロールを備えたWPFアプリケーションがあります。

ブラウザコントロールによって発行されたhttpリクエストをインターセプトしてトレースしたいと思います。

コンテンツを変更したくありません。ロードされたURLが特定のパターンに一致する場合にのみ、いくつかのルールを実行したいと思います。特に、Webコントロールにデータを取り込むデータを返すajax呼び出しがあります。

このデータをキャプチャして、コンテナアプリケーションでも機能させたいと思います。出来ますか?どのように?

conrtolにはLoadCompletedイベントがありますが、これは、subressourceSではなく、Sourceプロパティで指定されたURIに対してのみ発生します。

4

1 に答える 1

4

複製で答えたように、ここに解決策があります:

私はそのような問題を解決することができました。

サードパーティのアセンブリが必要になります:

  1. FiddlerCore:アプリケーションに埋め込まれたhttpプロキシとして機能します
  2. Awesomium.net:クロムエンジンで動作するWebBrowserコントロール。このエンジンを選択したのは、アプリケーション専用のプロキシサーバーを指定できるためです。

ご想像のとおり、このアイデアは、メモリ内プロキシサーバーを作成し、Webブラウザコントロールをこのプロキシにリダイレクトすることです。

次に、FiddlerCoreは、要求/応答、特に本文を分析できるいくつかのイベントを公開します。

プロキシとして機能するため、Ajax呼び出し、Flash呼び出しなどを含むすべての通信は、プロキシによってルーティングされます。

それが役立つ場合は、この動作のプロトタイプを作成するのに役立つ小さなコード:

App.cs:

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        BootStrap();
        base.OnStartup(e);
    }

    private void BootStrap()
    {
        SetupInternalProxy();
        SetupBrowser();
    }

    private static void SetupBrowser()
    {
        // We may be a new window in the same process.
        if (!WebCore.IsRunning)
        {
            // Setup WebCore with plugins enabled.
            WebCoreConfig config = new WebCoreConfig
            {
                ProxyServer = "http://127.0.0.1:" + FiddlerApplication.oProxy.ListenPort.ToString(),
                EnablePlugins = true,
                SaveCacheAndCookies = true
            };
            WebCore.Initialize(config);
        }
        else
        {
            throw new InvalidOperationException("WebCore should be already running");
        }
    }

    private void SetupInternalProxy()
    {
        FiddlerApplication.AfterSessionComplete += FiddlerApplication_AfterSessionComplete;
        FiddlerApplication.Log.OnLogString += (o, s) => Debug.WriteLine(s);

        FiddlerCoreStartupFlags oFCSF = FiddlerCoreStartupFlags.Default;
        //this line is important as it will avoid changing the proxy for the whole system.
        oFCSF = (oFCSF & ~FiddlerCoreStartupFlags.RegisterAsSystemProxy);

        FiddlerApplication.Startup(
            0,
            oFCSF
            );
    }

    private void FiddlerApplication_AfterSessionComplete(Session oSession)
    {
        Debug.WriteLine(oSession.GetResponseBodyAsString());
    }
}

MainWindow.xaml:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1" 
        xmlns:Custom="http://schemas.awesomium.com/winfx" 
        x:Class="WpfApplication1.MainWindow"
        Title="MainWindow" Height="350" Width="525" Loaded="MainWindow_Loaded">
    <Grid>

        <Custom:WebControl Name="browser"/>

    </Grid>
</Window>

そして最後に、MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        browser.LoadURL("http://google.fr");
    }
}

アプリからビジネスクラスへのリクエストをルーティングして分析するには、このアプリケーションに配管を追加する必要がありますが、それはこの質問の範囲を超えています。

于 2012-07-19T11:57:24.733 に答える