Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WebBrowser-Control: UnauthorizedAccessException beim Zugriff auf Frame anderer Domain
Ploetzi
myCSharp.de - Member

Avatar #avatar-2940.gif


Dabei seit:
Beiträge: 320

Themenstarter:

WebBrowser-Control: UnauthorizedAccessException beim Zugriff auf Frame anderer Domain

beantworten | zitieren | melden

Moderationshinweis von herbivore (23.12.2011 - 09:43:23):

translate.googleusercontent.com ist nur ein - zugegeben etwas ungünstig gewähltes - Beispiel.


Hallo,
ich rufe folgende Url auf in einem Webbrowser:


   string url2 = "http://translate.googleusercontent.com/translate_c?hl=en&rurl=translate.google.com&sl=en&tl=de&twu=1&u=http://www.orf.at" 

Im Document Completed bekomme ich bei folgendem Aufruf:


MessageBox.Show("Daten:" + webBrowser1.Document.Window.Frames[1].Document.Body.InnerHtml);

Eine UnAuthorizedAccessException.

Ich will den Sourcecode des unteren Frames auslesen.
Vermutlich ist das ein CrossSkriptingschutz.


Hat jemand eine Idee?
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Ploetzi am .
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

Zitat von Ploetzi
UnAuthorizedAccessException [...] Vermutlich ist das ein CrossSkriptingschutz.
Und das Ganze gibt's ja nicht ohne Grund:
Zitat von Google - Nutzungsbedingungen
Sie sind nicht berechtigt, die Dienste in missbräuchlicher Art und Weise zu nutzen, in die Dienste einzugreifen oder auf die Dienste in anderer Weise als über die von Google bereitgestellten Benutzeroberflächen und/oder Schnittstellen zuzugreifen. [...] Es ist Ihnen untersagt, auf die Dienste in automatisierter Weise zuzugreifen, beispielsweise mit Robots oder Skripts.
Also lass das und benutze die API so, wie du sollst/darfst (Google Translate API)
private Nachricht | Beiträge des Benutzers
Ploetzi
myCSharp.de - Member

Avatar #avatar-2940.gif


Dabei seit:
Beiträge: 320

Themenstarter:

beantworten | zitieren | melden

Hallo,
das ganze haengt hier nicht mit Google zusammen. Das passiert mir bei saemtlichen Framesets mit verschiedenen Urls

Das oben war nur ein Beispiel. Würde ich das nutzen,würde ich die Google Translator API nutzen. bzw. von Bing, dort gibts gratis access bis zu einer gewissen Anzahl an Requests, aber darum gehts eg bei meiner anfrage gerade nicht.

Grüsse,
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Ploetzi am .
private Nachricht | Beiträge des Benutzers
Lynix
myCSharp.de - Member



Dabei seit:
Beiträge: 670
Herkunft: Saarland

beantworten | zitieren | melden

Ich arbeite zwar nicht mit dem .NET Webbrowser Control, aber mit MSHTML und SHDocVW, wobei ich glaube, das .NET Webbrowser Control nutzt intern auch MSHTML bzw. SHDocVW.

Ich bin auf dasselbe Problem gestoßen wie Du - wenn eine Seite Frames mit src aus verschiedenen Domains beinhaltet, ist der Zugriff auf die Frames normalerweise nicht gestattet.

Ich habe aber einen Weg gefunden, das Ganz zu umgehen und zwar so:


public static class CrossDomainHelper
  {
    /// <summary>
    /// Returns the HTMLDocument object hostet by a specified frame element.
    /// If the passed IHTMLWindow2 instance is not a frame or a browser object, an invalid cast exception will be thrown.
    /// </summary>
    /// <param name="frame">IHTMLWindow2 instance wrapping up a HTMLFrameElement or a IHTMLWebBrowser2 instance.</param>
    /// <returns>The document hosted by the specified frame or browser object.</returns>
    public static IHTMLDocument2 GetCrossDomainDocumentFromFrame(IHTMLWindow2 frame)
    {
      int E_ACCESSDENIED = unchecked((int)0x80070005L);
      Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
      Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E");

      if (frame == null)
        return null;

      //Try if a cross domain conversion is necessary or if security setting don't restrict us from obtaining the frame document via the standard way...
      try
      {
        IHTMLDocument2 doc = frame.document;
        return doc;
      }
      catch (COMException comEx)
      {
        //In case a COMException is fired, check if it was a masked UnauthorizedAccess Exception
        if (comEx.ErrorCode != E_ACCESSDENIED)
        {
          //If it wasn't, some unexpected error occured -> return null in this case.
          return null;
        }
      }
      catch (System.UnauthorizedAccessException)
      {
        //Ignore UnathorizedAccessException, it only signals we have a cross domain access security restriction which we will deal with later.
      }
      catch
      {
        //any other unexpected error -> return null in this case
        return null;
      }

      //Let's deal with the cross domain restriction and retrieve the frame document using a COM service provider...
      try
      {
        // Convert IHTMLWindow2 to IWebBrowser2 using IServiceProvider and return the frame document if the COM extraction worked well.
        IServiceProvider sp = (IServiceProvider)frame;
        Object brws = null;
        sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out brws);
        SHDocVw.IWebBrowser2 browser = (SHDocVw.IWebBrowser2)(brws);

        return (IHTMLDocument2)browser.Document;
      }
      catch
      {
        //If for whatever reason the COM extraction doesn't work, return null...
        return null;
      }

      return null;
    }
  }
  
  /// <summary>
  /// COM service provider marshalling...
  /// </summary>
  [ComImport(), ComVisible(true), Guid("6D5140C1-7436-11CE-8034-00AA006009FA"),
  InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
  public interface IServiceProvider
  {
    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int QueryService(ref Guid guidService, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject);
  }

Wie Du das jetzt genau auf das .NET Webbrowser Control übertragen kannst, weiß ich nicht - dazu hab ich es mir nicht lange genug angeschaut. Für meinen Zweck reicht die Funktionalität des .NET Controls nicht aus, weswegen ich dann bei den SHDocVW / MSHTML COM-Komponenten gelandet bin.
"It is not wise to be wise" - Sun Tzu
private Nachricht | Beiträge des Benutzers
Ploetzi
myCSharp.de - Member

Avatar #avatar-2940.gif


Dabei seit:
Beiträge: 320

Themenstarter:

beantworten | zitieren | melden

Vielen Dank!
private Nachricht | Beiträge des Benutzers