WPF浏览器在加载图像时导航到byte[]

本文关键字:byte 导航 浏览器 加载 图像 WPF | 更新日期: 2023-09-27 18:12:28

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

对于图像和pdf,我可以检查mime类型,然后立即将字节数组从结果传递到控件以进行呈现。

然而,如果mime类型是HTML,那么我发现呈现HTML的唯一方法是将URL提供给web浏览器控件的Navigate函数,这会导致对远程服务的第二次HTTP调用。如果可能的话,我已经被要求删除这第二个请求。

我已经尝试将字节数组(e.t result)作为流传递给浏览器控件,然而,浏览器没有url可参考,因此无法解析相对链接的资源,如图像。是否有任何方法,我可以传递字节数组到web浏览器,它仍然知道如何使请求相对链接的内容?

WPF浏览器在加载图像时导航到byte[]

由于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);
  • 使用非标准浏览器。我所有的wpf项目都使用CEF (chrome embedded)浏览器,因为默认的wpf浏览器在很多方面都不能满足我的需求。c#绑定CEF - https://github.com/cefsharp/CefSharp(也有其他的)。