You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CefSharp实现DownloadHandler接口?CanDownload方法实现疑问

CefSharp自定义DownloadHandler中CanDownload方法的实现

CanDownload方法是CefSharp下载流程的前置校验逻辑,作用是判断是否允许启动当前下载请求:返回true则允许下载继续(触发后续OnBeforeDownload等方法),返回false则直接拦截该下载请求。

根据你的需求,这里提供几种常见实现方式:

1. 默认允许所有下载请求

如果不需要过滤下载,直接返回true即可,这是最常用的基础实现:

public bool CanDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, string url, string requestMethod)
{
    // 允许所有下载请求进入后续流程
    return true;
}

2. 按URL过滤下载(仅允许特定域名/路径)

如果需要限制只允许从特定域名或路径下载,可以通过判断url参数实现:

public bool CanDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, string url, string requestMethod)
{
    // 示例:仅允许来自example.com域名的下载
    return new Uri(url).Host.Equals("example.com", StringComparison.OrdinalIgnoreCase);
    
    // 也可以匹配特定路径,比如仅允许下载.zip文件
    // return url.EndsWith(".zip", StringComparison.OrdinalIgnoreCase);
}

3. 按请求方法过滤(仅允许GET请求)

下载通常使用GET请求,若要拦截POST等其他方法触发的下载,可判断requestMethod参数:

public bool CanDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, string url, string requestMethod)
{
    // 仅允许GET请求触发的下载
    return string.Equals(requestMethod, "GET", StringComparison.OrdinalIgnoreCase);
}

补全后的完整MyCustomDownloadHandler类

以下是结合默认允许逻辑的完整代码(已补全命名空间引用和接口实现):

using CefSharp;
using System;

public class MyCustomDownloadHandler : IDownloadHandler
{
    public event EventHandler<DownloadItem> OnBeforeDownloadFired;
    public event EventHandler<DownloadItem> OnDownloadUpdatedFired;

    public bool CanDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, string url, string requestMethod)
    {
        // 允许所有下载请求
        return true;
    }

    public void OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
    {
        if (downloadItem.IsValid)
        {
            Console.WriteLine("== File information ========================");
            Console.WriteLine(" File URL: {0}", downloadItem.Url);
            Console.WriteLine(" Suggested FileName: {0}", downloadItem.SuggestedFileName);
            Console.WriteLine(" MimeType: {0}", downloadItem.MimeType);
            Console.WriteLine(" Content Disposition: {0}", downloadItem.ContentDisposition);
            Console.WriteLine(" Total Size: {0}", downloadItem.TotalBytes);
            Console.WriteLine("============================================");
        }

        OnBeforeDownloadFired?.Invoke(this, downloadItem);

        if (!callback.IsDisposed)
        {
            using (callback)
            {
                callback.Continue(
                    downloadItem.SuggestedFileName,
                    showDialog: true
                );
            }
        }
    }

    public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
    {
        OnDownloadUpdatedFired?.Invoke(this, downloadItem);

        if (downloadItem.IsValid)
        {
            if (downloadItem.IsInProgress && (downloadItem.PercentComplete != 0))
            {
                Console.WriteLine(
                    "Current Download Speed: {0} bytes ({1}%)",
                    downloadItem.CurrentSpeed,
                    downloadItem.PercentComplete
                );
            }

            if (downloadItem.IsComplete)
            {
                Console.WriteLine("The download has been finished !");
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者MrWhoSBOSS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:45:42