自定义协议处理后是否可以避免CefSharp浏览器导航?

问题描述 投票:0回答:1

我有一个想要使用的简单自定义协议方案使用CefSharp在Windows中“启动”文件。该计划有效,但我找不到办法防止铬进入该文件的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;
}

有人知道如何防止随后的导航吗?

c# cefsharp custom-protocol
1个回答
2
投票

感谢amaitland,这就是答案-

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

详细信息:

public class Program
{
    // stuff ...

    var settings = new CefSettings();
    settings.RegisterScheme(new CefCustomScheme
    {
        SchemeName = EutpProtocol.SchemeName,
        SchemeHandlerFactory = new EutpProtocol()
    });

    // more stuff ...

    Cef.Initialize(settings);
}

public class EutpProtocol : ISchemeHandlerFactory
{
    public const string SchemeName = "eutp";

    public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
    {
        return new EutpProtocolHandler(browser, frame, schemeName, request);
    }
}

public class EutpProtocolHandler : ResourceHandler
{
    public EutpProtocolHandler(IBrowser browser, IFrame frame, string schemeName, IRequest request)
    {
        return;
    }

    public override CefReturnValue ProcessRequestAsync(IRequest request, ICallback callback)
    {
        return CefReturnValue.Cancel;
    }
}

public class EutpRequestHandler : CefSharp.Handler.RequestHandler
{
    public EutpRequestHandler()
    {
    }

    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;
        }
        return false; //this allows the navigation to proceed
    }
}

[如果您像我一样想知道是否可以完全放弃自定义协议处理程序,答案是否定的。如果不进行设置,则永远不会有机会拒绝RequestHandler中的导航。

© www.soinside.com 2019 - 2024. All rights reserved.