WPF Webbrowser 在加载图像时导航到 byte[]

WPF Webbrowser navigate to byte[] while still loading images

我有一个 WPF 应用程序,它具有显示图像、PDF 或 HTML 网页的动态视图。我的应用程序访问 Web 服务来请求这些类型的文件,然后根据返回的 MIME 类型选择图像控件、pdf 控件或 WPF WebBrowser 控件来呈现返回的数据。

对于图像和 PDF,我可以检查 mime 类型,然后立即将结果中的字节数组传递给控件进行渲染。

但是,如果 mime 类型是 HTML,那么我发现呈现 html 的唯一方法是将 URL 提供给 Web 浏览器控件的导航函数,它导致对远程服务的第二次 HTTP 调用。如果可能,我被要求删除第二个请求。

我尝试将字节数组 (e.Result) 作为流传递给浏览器控件,但是,浏览器没有 url 可供引用,因此无法解析相对链接的资源,例如图片。有什么方法可以将字节数组传递给 Web 浏览器,浏览器仍然知道如何请求相对链接的内容?

由于 WPF(和 WinForms)浏览器的实现方式,您不能开箱即用。从流或字符串加载时,它们将始终具有 url 个 "about:blank"。我想到的实现目标的选项:

  1. 通过添加
  2. 修改您下载的 html
<base href="http://your_site.com" /> 

head 元素内的标签(如果不存在则创建 head):

string html;
string url = "http://google.com";
var r = (HttpWebRequest) WebRequest.Create(url);
using (var rs = r.GetResponse().GetResponseStream()) {
    using (var reader = new StreamReader(rs, Encoding.UTF8)) {
        html = reader.ReadToEnd();
    }
 }
 // god forbid to do it like this, example only!
 html = html.Replace("<head>", "<head><base href=\"" + url + "\"");
 wb.NavigateToString(html);
  1. 使用非标准浏览器。我的所有 wpf 项目都使用 CEF(chromium embedded)浏览器,因为默认的 WPF 浏览器在很多方面都不能满足我的需求。 C# 绑定 CEF - https://github.com/cefsharp/CefSharp(还有其他)。