我需要处理f:///中的不同内容类型。我的应用程序在WPF应用程序中呈现脱机网站。除了指向其他内容文件(csv,mailto和pdf)的链接外,一切正常。
CefCustomScheme
,那么我将获得ProcessRequestAsync并可以运行Process.Start(...)。 然而另一个空白窗口也会弹出。 CefCustomScheme
,则没有任何反应。没有调用ISchemeHandler
ProcessRequestAsync方法。 我必须能够在单独的处理程序中处理除* .html之外的所有请求
基本上我只想复制MS Web浏览器控件的行为。我所做的只是指向入口页面(index.htm),并且所有内容都已加载。然后,如果用户单击任何链接,则控件处理该操作并启动正确的进程(内容处理程序,即Csv的Excel)。
代码:
// Startup
var settings = new CefSettings();
settings.LogFile = @"c:\temp\ceflog.txt";
settings.LogSeverity = LogSeverity.Verbose;
settings.IgnoreCertificateErrors = true;
CefCustomScheme mailtoScheme = new CefCustomScheme();
mailtoScheme.SchemeName = "mailto";
mailtoScheme.SchemeHandlerFactory = new SchemeHandlerFactory();
CefCustomScheme filesScheme = new CefCustomScheme();
mailtoScheme.SchemeName = "file";
mailtoScheme.SchemeHandlerFactory = new SchemeHandlerFactory();
settings.RegisterScheme(mailtoScheme);
settings.RegisterScheme(filesScheme);
if (!Cef.Initialize(settings))
throw new InvalidOperationException("Failed to initialize the browser factory");
- SchemeHandlerFactory
public class SchemeHandlerFactory : ISchemeHandlerFactory {
public ISchemeHandler Create() {
return new CustomSchemeHandler();
}
}
- 处理程序
public class CustomSchemeHandler : ISchemeHandler {
private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public bool ProcessRequestAsync(IRequest request, ISchemeHandlerResponse response, OnRequestCompletedHandler requestCompletedCallback) {
_log.DebugFormat("Processing url: {0}", request.Dump());
var knownContentTypes = new[] {".csv", ".xsls", ".xlsx", ".pdf", ".txt"};
var ext=Path.GetExtension(request.Url);
if(knownContentTypes.Contains(ext)) {
_log.DebugFormat("Starting process for: {0}",request.Url);
Process.Start(request.Url);
return false;
}
return true;
}
答案 0 :(得分:4)
解决方案是实现IRequestHandler并使用OnBeforeResourceLoad事件来检查请求的内容。 ISchemeHandler用于“mailto”操作。
在我的情况下,我必须在加载帧后分配请求处理程序。这允许Web浏览器首先呈现所有内容。
代码示例GitHub example