2012-09-06 26 views
8

Digamos que WPF WebBrowser control muestra algunos errores de navegación y la página no se muestra.Cómo manejar la excepción de navegación de control WPF WebBrowser

Por lo tanto, existe una excepción de WPF WebBrowser control.

Encontré una pregunta similar here pero no es lo que necesito.

De hecho, necesito algún método y objeto que tenga una excepción para obtenerlo de alguna forma.

¿Cómo podemos manejarlo?

¡Gracias!

P.S. Hay algún enfoque para WinForm WebBrowser Control ... ¿Podemos hacer algo similar para el control WPF WebBrowser?

public Form13() 
{ 
    InitializeComponent(); 

    this.webBrowser1.Navigate("http://blablablabla.bla"); 

     SHDocVw.WebBrowser axBrowser = (SHDocVw.WebBrowser)this.webBrowser1.ActiveXInstance; 
     axBrowser.NavigateError += 
      new SHDocVw.DWebBrowserEvents2_NavigateErrorEventHandler(axBrowser_NavigateError); 
} 

void axBrowser_NavigateError(object pDisp, ref object URL, 
     ref object Frame, ref object StatusCode, ref bool Cancel) 
{ 
    if (StatusCode.ToString() == "404") 
    { 
     MessageBox.Show("Page no found"); 
    } 
} 

P.S. # 2 Para alojar el control WinForm WebBrowser bajo la aplicación WPF no creo que sea una respuesta.

Respuesta

8

Estoy luchando con un problema similar. Cuando la computadora pierde conexión a Internet, queremos manejar eso de una manera agradable.

A falta de una mejor solución conecté el evento Navegado del WebBrowser y miro la url del documento. Si es res: //ieframe.dll, estoy bastante seguro de que se ha producido algún error.

tal vez es posible mirar el documento y ver si un servidor ha devuelto 404.

private void Navigated(object sender, NavigationEventArgs navigationEventArgs) 
{ 
    var browser = sender as WebBrowser; 
    if(browser != null) 
    { 
     var doc = AssociatedObject.Document as HTMLDocument; 
     if (doc != null) 
     { 
      if (doc.url.StartsWith("res://ieframe.dll")) 
      { 
       // Do stuff to handle error navigation 
      } 
     } 
    } 
} 
+0

Hace algún tiempo, puse un código similar al evento 'LoadCompleted'. Pero de vez en cuando 'doc.url' en producción devuelve valores nulos o vacíos. Así que creo que este enfoque no es confiable incluso cuando el código está en el controlador 'Navegado'. – Lu55

+0

¿Qué es 'AssociatedObject.Document'? no está claro para mí (estoy usando WPF, por cierto) – Jack

6

Está en cuestión de edad, pero ya que acaban de sufrir por esto, aunque yo bien podría compartir. Primero, implementé la solución de Markus pero quería algo mejor ya que nuestro Firewall reasigna 403 páginas de mensajes.

Encontré una respuesta here (entre otros lugares) que sugiere usar NavigationService ya que tiene un evento NavigationFailed.

En el XAML, añadir:

<Frame x:Name="frame"/> 

en el constructor de tu código subyacente, añaden:

frame.Navigated += new System.Windows.Navigation.NavigatedEventHandler(frame_Navigated); 
frame.NavigationFailed += frame_NavigationFailed; 
frame.LoadCompleted += frame_LoadCompleted; 

frame.NavigationService.Navigate(new Uri("http://theage.com.au")); 

Los manipuladores pueden ahora hacer frente a cualquiera de una navegación fallido o exitoso uno:

void frame_NavigationFailed(object sender, System.Windows.Navigation.NavigationFailedEventArgs e) 
{ 
    e.Handled = true; 
    // TODO: Goto an error page. 
} 

private void frame_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) 
{ 
    System.Diagnostics.Trace.WriteLine(e.WebResponse.Headers); 
} 

BTW: .Net 4.5 marco

+0

¡Esto se ve muy bien! Lástima que no tengo acceso a la base de código donde implementé mi solución más para poder probar esto.:( – Markus

+0

Parecía prometedor, pero no detecta las navegaciones iniciadas por el usuario desde el marco. Los eventos solo se activan para la llamada Navigate() que hice originalmente. – RandomEngy

1

También es posible utilizar el enfoque dynamic aquí.

wb.Navigated += delegate(object sender, NavigationEventArgs args) 
     { 
      dynamic doc = ((WebBrowser)sender).Document; 
      var url = doc.url as string; 
      if (url != null && url.StartsWith("res://ieframe.dll")) 
      { 
       // Do stuff to handle error navigation 
      } 
     }; 
Cuestiones relacionadas