2008-11-08 12 views
6

Piszę aplikację C# za pomocą formantu WebBrowser i chcę, aby cała zawartość wyświetlana pochodziła z zasobów osadzonych - nie statycznych plików lokalnych, a nie plików zdalnych.C# WebBrowser HTML z odwołaniami do skryptów i obrazów

Ustawienie początkowe teksty kontrolą do osadzonego pliku HTML działa świetnie z tym kodem zainspirowany this post:

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; 
} 

Tak dobre, jak to jest, pliki, o których mowa w HTML - JavaScript, obrazów jak <img src="whatever.png"/> itp., nie działają. Znalazłem podobne pytania: here i here, ale żadne z nich nie wymaga zadeklarowania dokładnie co mam na myśli, a mianowicie odnosząc się do osadzonych zasobów w pliku exe, a nie plików.

Próbowałem res://... i przy użyciu <base href='...", ale nie wydawało się działać (choć może nie mam tego dobrze).

Być może (kierując się moją własną propozycją na temat this question), używanie tylko trochę wbudowanego serwera C# jest jedynym sposobem ... ale pomyślałem, że jest jakaś sztuczka, żeby to osiągnąć?

Dzięki!

Odpowiedz

1

Widzę trzy sposoby, aby to dzieje:

1: napisz pliki potrzebne do plików płaskich w zakresie temp, poruszać się WebBrowser do pliku html i usuwać je po załadowaniu strony

2: jak mówisz, wbudowany web-server - herhaps HttpListener - należy jednak pamiętać, że ta wykorzystuje HTTP.SYS, a więc wymaga specjalnie uprawnionych administratora (lub trzeba pre-open the port)

3: jak 1, ale przy użyciu serwer named-pipe, aby uniknąć zapisywania pliku

Muszę powiedzieć, że pierwsze jest dużo prostsze i wymaga zerowej konfiguracji.

0
/// 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()); 
     } 
} 
Powiązane problemy