6 Stimmen

C# WebBrowser HTML mit Verweisen auf Skripte und Bilder

Ich schreibe eine C#-Anwendung mit dem WebBrowser-Steuerelement, und ich möchte alle Inhalte, die ich anzeigen, um von eingebetteten Ressourcen kommen - nicht statische lokale Dateien und nicht Remote-Dateien.

Das Setzen des Anfangstextes des Steuerelements auf eine eingebettete HTML-Datei funktioniert hervorragend mit diesem Code, der von diese Stelle :

browser.DocumentText=loadResourceText("myapp.index.html");

private string loadResourceText(string name)
{
    Assembly assembly = Assembly.GetExecutingAssembly();
    Stream stream = assembly.GetManifestResourceStream(name);
    StreamReader streamReader = new StreamReader(stream);
    String myText = streamReader.ReadToEnd();
    return myText;
}

So gut das auch ist, Dateien, auf die im HTML verwiesen wird - Javascript, Bilder wie <img src="whatever.png"/> usw., funktionieren nicht. Ich habe ähnliche Fragen gefunden aquí y aquí , aber auch nicht fragen genau was ich meine, nämlich die Bezugnahme auf eingebettet Ressourcen in der Exe, nicht Dateien.

Ich habe versucht res://... und die Verwendung eines <base href='..." aber beides schien nicht zu funktionieren (obwohl ich es vielleicht nicht richtig verstanden habe).

Vielleicht (nach meinem eigenen Vorschlag zu diese Frage ), ist die Verwendung eines kleinen eingebetteten C#-Webservers der einzige Weg... aber ich hätte gedacht, dass es irgendeinen Trick gibt, um das zum Laufen zu bringen?

Danke!

1voto

Marc Gravell Punkte 970173

Ich sehe drei Möglichkeiten, dies in Gang zu bringen:

1: Schreiben Sie die Dateien, die Sie benötigen, in flache Dateien im Temp-Bereich, navigieren Sie zum WebBrowser in die Html-Datei und löschen Sie sie, sobald die Seite geladen ist.

2: wie Sie sagen, ein eingebetteter Webserver - vielleicht HttpListener - aber beachten Sie, dass dies HTTP.SYS verwendet und daher Administratorrechte erfordert (oder Sie müssen die den Hafen vorab öffnen )

3: wie 1, aber mit named-pipe-Server, um das Schreiben einer Datei zu vermeiden

Ich muss sagen, dass die erste Variante viel einfacher ist und keinerlei Konfiguration erfordert.

0voto

/// Hi try this may help u.
private string CheckImages(ExtendedWebBrowser browser)
{
      StringBuilder builderHTML = new StringBuilder(browser.Document.Body.Parent.OuterHtml);
      ProcessURLS(browser, builderHTML, "img", "src");                
      ProcessURLS(browser, builderHTML, "link", "href");
      // ext...

      return builderHTML.ToString();

}

private static void ProcessURLS(ExtendedWebBrowser browser, StringBuilder builderHTML, string strLink, string strHref)
{
     for (int k = 0; k < browser.Document.Body.Parent.GetElementsByTagName(strLink).Count; k++)
     {
          string strURL = browser.Document.Body.Parent.GetElementsByTagName(strLink)[k].GetAttribute(strHref);
          string strOuterHTML = browser.Document.Body.Parent.GetElementsByTagName(strLink)[k].OuterHtml;
          string[] strlist = strOuterHTML.Split(new string[] { " " }, StringSplitOptions.None);
          StringBuilder builder = new StringBuilder();
          for (int p = 0; p < strlist.Length; p++)
          {
              if (strlist[p].StartsWith(strHref))                        
                  builder.Append (strlist[p].Contains("http")? strlist[p] + " ":
                      (strURL.StartsWith("http") ?  strHref + "=" + strURL + " ":
                           strHref + "= " + "http://xyz.com" + strURL + " " ));                           
              else
                  builder.Append(strlist[p] + " ");
          }

          builderHTML.Replace(strOuterHTML, builder.ToString());
      }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X