C # WebBrowser HTML со ссылками на скрипты и изображения - PullRequest
6 голосов
/ 08 ноября 2008

Я пишу приложение на C # с использованием элемента управления WebBrowser и хочу, чтобы весь отображаемый контент поступал из встроенных ресурсов - не статических локальных файлов и не удаленных файлов.

Установка исходного текста элемента управления во встроенный HTML-файл прекрасно работает с этим кодом, вдохновленным этим сообщением :

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

Как бы то ни было, файлы, указанные в HTML - javascript, изображения типа <img src="whatever.png"/> и т. Д. Не работают. Я нашел похожие вопросы здесь и здесь , но ни один из них не задает точно , что я имею в виду, а именно, ссылаясь на встроенные ресурсы в exe не файлы.

Я пытался res://... и использовал <base href='...", но ни один из них не работал (хотя, возможно, я не понял это правильно).

Возможно (следуя моему собственному предложению по этому вопросу ), использование небольшого встроенного веб-сервера на C # - единственный способ ... но я бы подумал, что для этого есть какой-то трюк?

Спасибо!

Ответы [ 2 ]

1 голос
/ 08 ноября 2008

Я вижу три способа добиться этого:

1: запишите файлы, которые вам нужны, чтобы выровнять файлы во временной области, перейдите WebBrowser к html-файлу и удалите их после загрузки страницы

2: как вы говорите, встроенный веб-сервер - herhaps HttpListener - но учтите, что он использует HTTP.SYS и поэтому требует привилегий администратора (или вам нужно предварительно открыть порт )

3: как 1, но с использованием сервера именованных каналов, чтобы избежать записи файла

Я должен сказать, что первое намного проще и требует нулевой настройки.

0 голосов
/ 24 сентября 2009
/// 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());
      }
}
...