Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I'm trying to display a local pdf file using a custom LocalSchemeHandler which reads a memory stream from the file.

The file exists and the memory stream is being read properly. But there is nothing being displayed in the browser window. Displaying the same file via file scheme works.

ResourceHandler:

public class LocalSchemeHandler : ResourceHandler
    public override bool ProcessRequestAsync(IRequest request, ICallback callback)
        var uri = new Uri(request.Url);
        var file = uri.AbsolutePath;
        Task.Run(() =>
            using (callback)
                if (!File.Exists(file))
                    callback.Cancel();
                    return;
                byte[] bytes = File.ReadAllBytes(file);
                var stream = new MemoryStream(bytes);
                if (stream == null)
                    callback.Cancel();
                    stream.Position = 0;
                    ResponseLength = stream.Length;
                    var fileExtension = Path.GetExtension(file);
                    MimeType = GetMimeType(fileExtension);
                    StatusCode = (int)HttpStatusCode.OK;
                    Stream = stream;
                    callback.Continue();
        return true;

ISchemeHandlerFactory:

public class CustomProtocolSchemeHandlerFactory : ISchemeHandlerFactory
    public const string SchemeName = "local";
    public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
        return new LocalSchemeHandler();

Settings:

var settings = new CefSettings();
settings.RegisterScheme(new CefCustomScheme
    SchemeName = CustomProtocolSchemeHandlerFactory.SchemeName,
    SchemeHandlerFactory = new CustomProtocolSchemeHandlerFactory()
// Increase the log severity so CEF outputs detailed information, useful for debugging
settings.LogSeverity = LogSeverity.Default;
Cef.Initialize(settings);
Trying to display the PDF file via ResourceHandler.FromFilePath also doesn't work (nothing is displayed).

public class CustomProtocolSchemeHandlerFactory : ISchemeHandlerFactory
    public const string SchemeName = "local";
    public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
        var uri = new Uri(request.Url);
        var file = uri.AbsolutePath;
        var fileExtension = Path.GetExtension(file);
        var mimeType = ResourceHandler.GetMimeType(fileExtension);
        return ResourceHandler.FromFilePath(file, mimeType);

EDIT2

After setting LogSeverity to Default the log says: [0524/150955.108:INFO:CONSOLE(20)] "Refused to load plugin data from 'local://c/Users/abidh/Desktop/pdf.pdf' because it violates the following Content Security Policy directive: "object-src * blob: externalfile: file: filesystem: data:".

Try the built in implementation github.com/cefsharp/CefSharp/blob/cefsharp/63/CefSharp.Example/… – amaitland May 24, 2018 at 11:46

Didn't find a solution using google. Thanks to amaitland, using the IsCSPBypassing property solved the problem:

var settings = new CefSettings();
settings.RegisterScheme(new CefCustomScheme
    SchemeName = CustomProtocolSchemeHandlerFactory.SchemeName,
    SchemeHandlerFactory = new CustomProtocolSchemeHandlerFactory(),
    IsCSPBypassing = true
settings.LogSeverity = LogSeverity.Error;
Cef.Initialize(settings);
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.