我正在尝试在cefsharp浏览器本身中打开pdf。但是当我打开pdf时什么也没显示。我已将日志设置为错误级别,但是其中没有错误。
这就是我注册CefCustomScheme的方式:
settings.RegisterScheme(new CefCustomScheme
{
SchemeName = CefSharpSchemeHandlerFactory.SchemeName,SchemeHandlerFactory = new CefSharpSchemeHandlerFactory(),IsCSPBypassing = true,});
这是我的CefSharpSchemeHandlerFactory:
public class CefSharpSchemeHandlerFactory : ISchemeHandlerFactory
{
public const string SchemeName = "local";
public IResourceHandler Create(IBrowser browser,IFrame frame,string schemeName,IRequest request)
{
if (schemeName == SchemeName && request.Url.EndsWith("CefSharp.Core.xml",System.StringComparison.OrdinalIgnoreCase))
{
//Convenient helper method to lookup the mimeType
var mimeType = ResourceHandler.GetMimeType(".xml");
//Load a resource handler for CefSharp.Core.xml
//mimeType is optional and will default to text/html
return ResourceHandler.FromFilePath("CefSharp.Core.xml",mimeType);
}
return new CefSharpSchemeHandler();
}
}
这是我的CefSharpSchemeHandler:
internal class CefSharpSchemeHandler : IResourceHandler
{
private static readonly IDictionary<string,string> ResourceDictionary;
private string mimeType;
private MemoryStream stream;
static CefSharpSchemeHandler()
{
}
bool IResourceHandler.ProcessRequest(IRequest request,ICallback callback)
{
// The 'host' portion is entirely ignored by this scheme handler.
var uri = new Uri(request.Url);
var fileName = uri.AbsolutePath;
string resource;
if (ResourceDictionary.TryGetvalue(fileName,out resource) && !string.IsnullOrEmpty(resource))
{
Task.Run(() =>
{
using (callback)
{
var bytes = Encoding.UTF8.GetBytes(resource);
stream = new MemoryStream(bytes);
var fileExtension = Path.GetExtension(fileName);
mimeType = ResourceHandler.GetMimeType(fileExtension);
callback.Continue();
}
});
return true;
}
else
{
callback.Dispose();
}
return false;
}
void IResourceHandler.GetResponseHeaders(IResponse response,out long responseLength,out string redirectUrl)
{
responseLength = stream == null ? 0 : stream.Length;
redirectUrl = null;
response.StatusCode = (int)HttpStatusCode.OK;
response.StatusText = "OK";
response.MimeType = mimeType;
}
bool IResourceHandler.ReadResponse(Stream dataOut,out int bytesRead,ICallback callback)
{
callback.Dispose();
if(stream == null)
{
bytesRead = 0;
return false;
}
//Data out represents an underlying buffer (typically 32kb in size).
var buffer = new byte[dataOut.Length];
bytesRead = stream.Read(buffer,buffer.Length);
dataOut.Write(buffer,buffer.Length);
return bytesRead > 0;
}
bool IResourceHandler.Cangetcookie(Cookie cookie)
{
return true;
}
bool IResourceHandler.CanSetCookie(Cookie cookie)
{
return true;
}
void IResourceHandler.Cancel()
{
}
void IDisposable.Dispose()
{
}
}
这就是我从其他班级打开pdf文件的方式:
string pdfPath = @"D:\Magic\10774.pdf";
var mimeType = ResourceHandler.GetMimeType(".pdf");
ResourceHandler.FromFilePath(pdfPath,mimeType);
我在CefSharpSchemeHandlerFactory创建方法上没有受到关注。