Recientemente, tuve la necesidad de interceptar y analizar TODAS las comunicaciones en un control de navegador web. Creo que la técnica que utilicé puede ayudarte.
lo que necesita:
- Awesomium.Net: un control basado en el motor de cromo para .NET
- Fiddler Core: un proxy HTTP en memoria, que le permite controlar la comunicación HTTP.
- HtmlAgility pack: según la solución que elija, HAP puede ayudarle a cambiar dinámicamente el DOM del contenido html, de una forma MUCHO MÁS CONFIABLE que una expresión regular.
Elijo usar Awesomium porque ofrece muchas más funciones que el navegador de la caja de control de la web. En mi caso, me permite definir el proxy a usar en lugar de la configuración de todo el sistema.
Fiddler Core se utiliza para interceptar la comunicación. Su API proporciona formas de interceptar/forzar/... cuando se emiten solicitudes. En mi caso, solo estaba enviando cuerpos de respuesta a mis clases de negocios, pero en su caso, debería poder filtrar en mime-type para cambiar el HTML DOM (Usar el paquete HtmlAgility !!!!!) o devolverlo no 200 estado HTTP para imágenes.
Aquí está el código que utilicé. Mi aplicación WPF, pero se puede adaptar a Winform con pocos esfuerzos:
public partial class App : Application
{
static App()
{
// First, we set up the internal proxy
SetupInternalProxy();
// The we set up the awesomium engine
SetupBrowser();
}
private static void SetupInternalProxy()
{
// My requirement is to get response content, so I use this event.
// You may use other handlers if you have to tamper data.
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 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
{
// Here we plug the internal proxy to the awesomium engine
ProxyServer = "http://127.0.0.1:" + FiddlerApplication.oProxy.ListenPort.ToString(),
// Adapt others options related to your needs
EnablePlugins = true,
SaveCacheAndCookies = true,
UserDataPath = Environment.ExpandEnvironmentVariables(@"%APPDATA%\MyApp"),
};
WebCore.Initialize(config);
}
else
{
throw new InvalidOperationException("WebCore should be already running");
}
}
// Here is the handler where I intercept the response
private static void FiddlerApplication_AfterSessionComplete(Session oSession)
{
// Send to business objects
DoSomethingWith(
oSession.PathAndQuery,
oSession.ResponseBody,
oSession["Response", "Content-Type"]
);
}
}
Como dije en el comentario, es posible usar otro controlador de eventos que AfterSessionComplete. Dependerá de sus requisitos (lea el SDK del núcleo del violinista para obtener ayuda).
Una última palabra: este código se ejecuta desde la clase de la aplicación (equivalente a la clase de programa en Winform). Es posible que necesite utilizar un sistema de mensajería o publicar un evento global (tenga cuidado con la pérdida de memoria) para usar el resultado en una clase de Windows. También debe tener en cuenta que el evento AfterSessionComplete se activa desde varios subprocesos, a veces simultáneamente. Utilizará algún tipo de invocación para trabajar en el hilo de la interfaz de usuario.
Es posible que desee el no codicioso +? cuantificador: '" "' –
AKX
¡Ahhh! ¡Analizando HTML con Regex! http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – annonymously