3

Я пытаюсь использовать CefSharp web browser внутри приложения .NET 4.0. Я загружаю страницы из html и js контента, хранящихся локально. Таким образом, веб-браузер открывает страницы с протоколом file://.CefSharp and Crossdomain

страница переходы сделаны с JQuery (AJAX), и я получаю XMLHttpRequest cannot load file:///XXXXXXXX/Debug/res/www/shared/js/src/views/homeView.html. Cross origin requests are only supported for HTTP.

Я попытался с помощью Schemehandler и переопределить функцию ProcessRequest для обработки загрузки страниц внутри домена file://.

class SchemeHandlerFactory : ISchemeHandlerFactory 
{ 
    public ISchemeHandler Create() 
    { 
     return new SchemeHandler(); 
    } 
} 

class SchemeHandler : ISchemeHandler 
{ 
    public SchemeHandler() 
    { 
    } 

    public bool ProcessRequest(IRequest request, ref string mimeType, ref Stream stream) 
    { 
     var uri = new Uri(request.Url); 
     var segments = uri.Segments; 
     var file = segments[segments.Length - 1]; 

     var bytes = File.ReadAllBytes(request.Url.Replace("file:///","")); 
      stream = new MemoryStream(bytes); 
      mimeType = "text/html"; 

      return true; 
    } 
} 

И я использую его в моем коде формы, добавив:

CEF.RegisterScheme("file", new SchemeHandlerFactory()); 

это ничего не меняет.

Я проверил журналы фиксации на репо CefSharp, и он говорит, что теперь поддерживается Cross AppDomain, но как его использовать? https://github.com/cefsharp/CefSharp/pull/35

Я также думал о перекомпиляции CefSharp добавить Access-Control-Allow-Origin для всех запросов, возвращаемых в веб-браузере, когда он выполняет GET операции на локальных файлах.

У меня нет идей.

ответ

7

Я нашел решение, вот если кто-то нуждается в помощи с этим:

BrowserSettings browserSettings = new BrowserSettings(); 
    browserSettings.FileAccessFromFileUrlsAllowed = true; 
    browserSettings.UniversalAccessFromFileUrlsAllowed = true; 
    browserSettings.TextAreaResizeDisabled = true; 
    string urlToNavigate = 
       Application.StartupPath + @"\res\www\shared\index.html"; 
    web_view = new WebView(urlToNavigate, browserSettings); 

Мы должны поставить FileAccessFromFileUrlsAllowed к истинным и UniversalAccessFromFileUrlsAllowed.

+3

Ваш ответ, вероятно, правильный. Тем не менее, очень важно отметить: * cross-AppDomains - это не то же самое, что кросс-домены в веб-смысле *. Это две очень разные вещи. AppDomains - это сложная концепция, которая может быть использована для разделения приложения .NET на «разгружаемые», разделенные части. Таким образом, у них есть похожие имена, но они действуют по-разному. –

0

Этот код работает на CEF: r3.2987.1601(формы Windows)

browser = new ChromiumWebBrowser("www.websites.com") 
      { 
       Dock = DockStyle.Fill, 
      }; 
toolStripContainer.ContentPanel.Controls.Add(browser); 

//browser.BrowserSettings.WebSecurity = CefState.Disabled; 
browser.BrowserSettings.FileAccessFromFileUrls = CefState.Enabled; 
browser.BrowserSettings.UniversalAccessFromFileUrls = CefState.Enabled; 

https://github.com/cefsharp/CefSharp/issues/1397

Будьте очень осторожны с:

//browser.BrowserSettings.WebSecurity = CefState.Disabled; 

Этот код оставляет ваш компьютер уязвимым для вредоносных атак.