CefSharp.Wpf: открывать csv, mailto и pdf с помощью Process.Start()

Мне нужно обрабатывать разные типы контента из f:///. Мое приложение отображает автономные веб-сайты в приложении WPF. Все работает, кроме ссылок на другие файлы контента (csv, mailto и pdf).

  • Если я зарегистрирую CefCustomScheme для «mailto», я получу ProcessRequestAsync и смогу запустить Process.Start(...). Однако всплывает еще одно пустое окно.
  • Если я затем добавлю второй CefCustomScheme для «файла», то ничего не произойдет. Ни один из методов ISchemeHandler ProcessRequestAsync не вызывается.

Я должен иметь возможность обрабатывать все запросы, кроме *.html, в отдельном обработчике.

По сути, я просто хочу воспроизвести поведение MS Web-Browser Control. Там все, что я сделал, это указал на страницу входа (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");

-- Фабрика Обработчиков Схем

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;
}

person JDeVil    schedule 06.03.2015    source источник
comment
Не могли бы вы отредактировать свой вопрос, включив в него ISchemeHandler и способ их регистрации?   -  person Szabolcs Dézsi    schedule 06.03.2015
comment
Привет @SzabolcsDézsi, я обновил вопрос и добавил как можно больше деталей.   -  person JDeVil    schedule 09.03.2015
comment
Когда вы создаете filesScheme, вы по-прежнему ссылаетесь на mailtoScheme после этого. Мне не удалось заставить ссылки на файлы работать с подходом обработчика схемы. Если вы установите RequestHandler элемента управления вашего браузера и поместите код, в котором вы запускаете процесс, в метод OnBeforeBrowse, вы можете добиться желаемого эффекта. Пробовал с CefSharp.Wpf 37.0.0   -  person Szabolcs Dézsi    schedule 14.03.2015


Ответы (1)


Решение состояло в том, чтобы реализовать IRequestHandler и использовать событие OnBeforeResourceLoad для проверки того, какой контент был запрошен. ISchemeHandler используется для действий «mailto».

В моем случае мне пришлось назначить обработчик запроса после загрузки фрейма. Это позволило веб-браузеру сначала отображать весь контент.

Пример кода пример GitHub

person JDeVil    schedule 15.03.2015