CefSharp1:自定义HTTP SchemeHandler,具有回退到默认值

时间:2015-02-25 14:29:11

标签: c# cefsharp

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

我目前正在使用1.25.7的CefSharp,但我确实升级到了版本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是我自己的类。我这样做是为了更好地组织我的自定义处理程序。

1 个答案:

答案 0 :(得分:1)

目前CefSharp目前不支持。

基础CEF库允许在CefSchemeHandlerFactory.Create()

中使用它
  

返回一个新的资源处理程序实例来处理请求或一个空引用以允许默认处理请求。

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更难。