C#WebBrowser HTML,其中包含对脚本和图像的引用

本文关键字:脚本 图像 引用 包含 HTML C#WebBrowser | 更新日期: 2023-09-27 17:48:50

我正在使用WebBrowser控件编写一个C#应用程序,我希望我显示的所有内容都来自嵌入式资源,而不是静态本地文件,也不是远程文件。

将控件的初始文本设置为嵌入的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#Web服务器是唯一的方法。。。但我本以为有什么诀窍可以让这件事继续下去?

谢谢!

C#WebBrowser HTML,其中包含对脚本和图像的引用

我可以看到三种方法来实现这一点:

1:将需要的文件写入临时区域中的平面文件,将WebBrowser导航到html文件,并在页面加载后将其删除

2:正如您所说,嵌入式web服务器-herhaps HttpListener-但请注意,这使用HTTP.SYS,因此需要管理员权限(或者您需要预先打开端口)

3:类似于1,但使用命名管道服务器以避免写入文件

我不得不说,第一个要简单得多,并且需要零配置。

/// 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());
      }
}