CefSharp1:回退到默认值的自定义 HTTP SchemeHandler

CefSharp1: Custom HTTP SchemeHandler with fallback to default

我正在编写一个应用程序,我需要用我自己的处理程序覆盖 HTTP 和 HTTPS 方案。但是,我需要让任何未处理的请求回退到默认处理程序并正常处理。我以为我可以从 ProcessRequestAsync return "false" 但这不起作用。任何见解将不胜感激。我宁愿不必构建自己的 "fallback",因为它似乎会有问题。

我目前使用的是 CefSharp 1.25.7,但是我确实升级到版本 37 并得到了相同的结果。

这是我的 SchemeHandler 的代码:

public bool ProcessRequestAsync(IRequest request, SchemeHandlerResponse response, OnRequestCompletedHandler requestCompletedCallback)
{
    Uri uri = new Uri(request.Url);

    foreach (IUriInterceptor interceptor in _interceptors)
    {

        if (interceptor.canHandle(uri))
        {
            interceptor.handleRequest(request, response);
            requestCompletedCallback.Invoke();
            return true;
        }
    }

    return false;
}

IUriInterceptor 是我自己的class。我这样做是为了更好地组织我的自定义处理程序。

CefSharp 目前不支持此功能。

底层 CEF 库在 CefSchemeHandlerFactory.Create():

中允许它

Return a new resource handler instance to handle the request or an empty reference to allow default handling of the request.

http://magpcss.org/ceforum/apidocs3/projects/(default)/CefSchemeHandlerFactory.html

但是 CefSharp 中的 C++ 实现总是期望返回一个处理程序,因此您永远不能告诉 CEF 允许默认处理:

CefRefPtr<CefResourceHandler> SchemeHandlerFactoryWrapper::Create(
    CefRefPtr<CefBrowser> browser,
    CefRefPtr<CefFrame> frame,
    const CefString& scheme_name,
    CefRefPtr<CefRequest> request)
{
    ISchemeHandler^ handler = _factory->Create();
    CefRefPtr<SchemeHandlerWrapper> wrapper = new SchemeHandlerWrapper(handler);
    return static_cast<CefRefPtr<CefResourceHandler>>(wrapper);
}

https://github.com/cefsharp/CefSharp/blob/00b25f5e3fac20b94b3022019fdeefbac6f9e271/CefSharp.Core/SchemeHandlerFactoryWrapper.cpp#L19-L21

需要更改 CefSharp 的源代码才能使其正常工作。他们非常乐意指导贡献者并接受对项目的贡献(记住,它是开源且免费的!)。

另一种选择是使用 CefGlue 项目,它是使用 pinvoke 的 CEF 的最小包装器,因此它可能开箱即用。但是,将 CefGlue 集成到您的 WinForms 或 WPF 应用程序中可能比 CefSharp 更难。