首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在DotNetBrowser中阻止加载远程内容?

如何在DotNetBrowser中阻止加载远程内容?
EN

Stack Overflow用户
提问于 2020-10-28 23:22:29
回答 1查看 79关注 0票数 1

我在WPF电子邮件应用程序中使用DotNetBrowser来显示电子邮件内容。我想屏蔽所有远程内容和远程图像。我使用这个email privacy tester检查我是否可以正确地阻止远程内容。

我查看了DotNetBrowser的文档,发现可以使用BrowserPreferences设置禁用一些东西。我用下面这段代码禁用了所有功能:

代码语言:javascript
运行
复制
BrowserPreferences pref = new BrowserPreferences {
    ImagesEnabled = false,
    JavaScriptEnabled = false,
    PluginsEnabled = false,
    WebAudioEnabled = false,
    ApplicationCacheEnabled = false,
    LocalStorageEnabled = false,
    AllowDisplayingInsecureContent = false,
    AllowRunningInsecureContent = false,
    ...
};

wpfBrowserView.Browser.Preferences = pref;
wpfBrowserView.Browser.LoadHTML(myHtml);

但这只阻止了几个可能有害的内容。然后我设置了一个自定义的LoadHandler,在这里我可以防止更多的情况发生:

代码语言:javascript
运行
复制
MyBrowserLoadHandler loadHandler = new MyBrowserLoadHandler();
loadHandler.Load += args => {
    // just don't allow to load the content
};
wpfBrowserView.Browser.LoadHandler = loadHandler;

这是不够的,因为它仍然无法满足其中两个( Link PrefetchCSS link tag)的要求。

我不想在电子邮件的html上做静态分析来处理这些情况,所以我在寻找一种更简单的方法。例如,在安卓的WebView中,它只需要调用两个方法(setBlockNetworkLoads(true)setBlockNetworkImage(true)),然后它就完成了所有的工作。在DotNetBrowser中有这样的解决方案吗?

EN

Stack Overflow用户

回答已采纳

发布于 2020-10-29 18:48:29

最后我找到了解决方案。我放弃了上面发布的所有尝试,并尝试了另一种方法。DotNetBrowser有一个resource handler,你可以设置允许加载哪种类型的资源,以及不允许加载什么。下面是我的代码:

代码语言:javascript
运行
复制
var network = wpfBrowserView.Browser.Context.NetworkService;
var resourceHandler = new MyResourceHandler();
resourceHandler.Load += args => {
    ResourceType resource = args.Parameters.ResourceType;

    switch (resource) {
        case ResourceType.PREFETCH:
        case ResourceType.IMAGE:
        case ResourceType.MEDIA:
        case ResourceType.OBJECT:
        case ResourceType.STYLESHEET:
        case ResourceType.FONT_RESOURCE:
        case ResourceType.SUB_RESOURCE:
            return false;
        default:
            // allow to load for the others
            return true;
    }
};

network.ResourceHandler = resourceHandler;

和自定义资源处理程序:

代码语言:javascript
运行
复制
public class ResourceLoadEventArgs {
    public ResourceParams Parameters { get; set; }
}

public delegate bool ResourceLoadHandler(ResourceLoadEventArgs args);

public class MyResourceHandler : ResourceHandler {
    public event ResourceLoadHandler Load;

    public bool CanLoadResource(ResourceParams parameters) {
        return Load?.Invoke(new ResourceLoadEventArgs { Parameters = parameters }) ?? true;
    }
}

因此,在将html加载到浏览器视图之前添加这段代码,将导致通过电子邮件隐私测试器中的每项测试。然后,您可以为用户放置一个按钮来加载远程内容,当用户单击该按钮时,您可以允许每个资源。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64575965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档