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);
}
需要更改 CefSharp 的源代码才能使其正常工作。他们非常乐意指导贡献者并接受对项目的贡献(记住,它是开源且免费的!)。
另一种选择是使用 CefGlue 项目,它是使用 pinvoke 的 CEF 的最小包装器,因此它可能开箱即用。但是,将 CefGlue 集成到您的 WinForms 或 WPF 应用程序中可能比 CefSharp 更难。
我正在编写一个应用程序,我需要用我自己的处理程序覆盖 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);
}
需要更改 CefSharp 的源代码才能使其正常工作。他们非常乐意指导贡献者并接受对项目的贡献(记住,它是开源且免费的!)。
另一种选择是使用 CefGlue 项目,它是使用 pinvoke 的 CEF 的最小包装器,因此它可能开箱即用。但是,将 CefGlue 集成到您的 WinForms 或 WPF 应用程序中可能比 CefSharp 更难。