1

我有一个简单的自定义协议方案,我想将它与 CefSharp 一起用于在 Windows 中“启动”一个文件。该方案有效,但我找不到阻止 chromium 导航到该文件 url 的方法(在下面的代码中由 Process.Start 成功调用它之后)。我已经尝试了 CefReturnValue 和 callback.Dispose 和 request.Dispose 的几乎所有组合

这是代码:

public override CefReturnValue ProcessRequestAsync(IRequest request, ICallback callback)
{
    var uri = new Uri(request.Url);
    string requestedPath = WebUtility.UrlDecode(uri.AbsolutePath);

    if (requestedPath.StartsWith("///"))
        requestedPath = requestedPath.Substring(3).Replace("/", @"\");

    if (File.Exists(requestedPath))
        Process.Start(requestedPath);

    callback.Dispose();
    return CefReturnValue.Cancel;
}

有谁知道如何防止后续导航?

4

1 回答 1

3

感谢amaitland,这就是答案——

摘要:谁需要自定义协议?

细节:

public class Program
{
    // stuff ...

    var settings = new CefSettings();
    settings.RegisterScheme(new CefCustomScheme { SchemeName = "eutp"});

    // more stuff ...

    Cef.Initialize(settings);
}

public class EutpRequestHandler : CefSharp.Handler.RequestHandler
{
    protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser,  IBrowser browser,
        IFrame frame, IRequest request, bool userGesture, bool isRedirect)
    {
        if (request.Url.StartsWith("eutp://file///")) {
            string requestedPath = WebUtility.UrlDecode(request.Url.Substring(14));
            requestedPath = requestedPath.Replace("/", @"\");
            if (File.Exists(requestedPath))
                Process.Start(requestedPath);

            return true; // cancel navigation
        }
        return false; // allows navigation
    }
}

再次感谢 amaitland 指出自定义协议方案工厂处理程序是多余的。只有方案的名称是必需的。

于 2020-05-07T23:05:12.490 回答