Мне нужно обрабатывать различные типы контента из f: ///. Мое приложение отображает автономные веб-сайты в приложении WPF. Все работает, за исключением ссылок на другие файлы контента (csv, mailto и pdf).CefSharp.Wpf: Открыть csv, mailto и pdf с помощью Process.Start (...)
- Если я зарегистрировать
CefCustomScheme
для "MAILTO", то я получаю ProcessRequestAsync и может запустить Process.Start (...). Однако другое пустое окно также всплывает. - Если я затем добавлю второй
CefCustomScheme
для «файла», то ничего не произойдет. Ни один из методовISchemeHandler
ProcessRequestAsync не вызывается.
я должен быть в состоянии обрабатывать все запросы, за исключением * .html, в отдельном обработчике
По сути я просто хочу, чтобы воспроизвести поведение Web-браузера Control MS. Там все, что я сделал, это указать на страницу входа (index.htm), и все загружено. Затем, если пользователь нажимает на любую ссылку, элемент управления обрабатывает действие и запускает правильный процесс (обработчик контента, то есть Excel для Csv).
Код:
// 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;
}
Не могли бы вы изменить свой вопрос, включив в него 'ISchemeHandler's и как вы их регистрации? –
Привет @ SzabolcsDézsi, я обновил вопрос и добавил как можно больше деталей, чем возможно. – JDeVil
Когда вы создаете 'filesScheme', вы все равно ссылаетесь на' mailtoScheme' после этого. Мне не удалось заставить ссылки на файл работать с подходом схемы. Если вы установили 'RequestHandler' вашего элемента управления браузера и поместили код, в котором вы запустили процесс, в метод OnBeforeBrowse, вы можете добиться желаемого эффекта. Я пробовал его с помощью CefSharp.Wpf 37.0.0 –