using CefSharp; using NLog; using POSV.Cef.Client.Properties; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace POSV.Cef.Client.ClientComm { internal class CustomSchemeHandler : IResourceHandler { private readonly IDictionary resources; private string mimeType; private MemoryStream stream; Logger logger = null; public CustomSchemeHandler() { logger = LogManager.GetLogger(this.GetType().FullName); //这样加载非常浪费资源 resources = new Dictionary { }; } public byte[] BitmapToBytes(Bitmap Bitmap) { MemoryStream ms = null; try { ms = new MemoryStream(); Bitmap.Save(ms, Bitmap.RawFormat); byte[] byteImage = new Byte[ms.Length]; byteImage = ms.ToArray(); return byteImage; } catch (ArgumentNullException ex) { return null; } finally { ms.Close(); } } // 当收到请求时的处理器 bool IResourceHandler.ProcessRequest(IRequest request, ICallback callback) { try { var uri = new Uri(request.Url); var resourceName = uri.AbsolutePath; var _Splits = resourceName.Split('/'); var _resources = "";//文件名 var _resourcename = ""; if (_Splits.Count() > 0) { _resources = _Splits[_Splits.Count() - 1]; } _resourcename = _resources.Split('.')[0]; if (Properties.Resources.ResourceManager.GetObject(_resourcename) == null) { logger.Info("CEF错误:找不到" + _resources + "资源文件"); return false; } using (callback) { if (_resources.Contains(".png") || _resources.Contains(".jpg")) { stream = new MemoryStream(this.BitmapToBytes((System.Drawing.Bitmap)Properties.Resources.ResourceManager.GetObject(_resourcename))); } else { stream = new MemoryStream(Encoding.UTF8.GetBytes((string)Properties.Resources.ResourceManager.GetObject(_resourcename))); } var fileExtension = Path.GetExtension(resourceName); mimeType = ResourceHandler.GetMimeType(fileExtension); if (!callback.IsDisposed) { callback.Continue(); } } return true; #region 久代码 //// 普通的文件资源处理 //byte[] resource; //if (resources.TryGetValue(resourceName, out resource)) //{ // using (callback) // { // stream = new MemoryStream(resource); // var fileExtension = Path.GetExtension(resourceName); // mimeType = ResourceHandler.GetMimeType(fileExtension); // if (!callback.IsDisposed) // { // callback.Continue(); // } // } // return true; //} //else //{ // logger.Info("CEF:网页加载时找不到资源文件,请确认文件引用是否正常。文件url:" + resourceName); //} #endregion } catch (Exception ex) { logger.Info("CEF错误:" + ex.Message); } return false; } // 当包装responseheader的处理代码 void IResourceHandler.GetResponseHeaders(IResponse response, out long responseLength, out string redirectUrl) { redirectUrl = null; response.MimeType = mimeType; if (stream != null) { responseLength = stream.Length; response.StatusCode = (int)System.Net.HttpStatusCode.OK; response.StatusText = "OK"; } else { responseLength = 0; response.StatusCode = (int)System.Net.HttpStatusCode.NotFound; response.StatusText = "NotFound"; } } // 当包装responsebody的处理代码 bool IResourceHandler.ReadResponse(Stream dataOut, out int bytesRead, ICallback callback) { callback.Dispose(); if (stream == null) { bytesRead = 0; return false; } var buffer = new byte[dataOut.Length]; bytesRead = stream.Read(buffer, 0, buffer.Length); dataOut.Write(buffer, 0, buffer.Length); return bytesRead > 0; } bool IResourceHandler.CanGetCookie(Cookie cookie) { return true; } bool IResourceHandler.CanSetCookie(Cookie cookie) { return true; } void IResourceHandler.Cancel() { } #region IDisposable Support private bool disposedValue = false; // 要检测冗余调用 protected virtual void Dispose(bool disposing) { if (!disposedValue) { if (disposing) { // TODO: 释放托管状态(托管对象)。 } // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。 // TODO: 将大型字段设置为 null。 disposedValue = true; } } // 添加此代码以正确实现可处置模式。 public void Dispose() { // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。 Dispose(true); // TODO: 如果在以上内容中替代了终结器,则取消注释以下行。 // GC.SuppressFinalize(this); } #endregion } public class CustomSchemeHandlerFactory : ISchemeHandlerFactory { public const string SchemeName = "custom"; public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request) { return new CustomSchemeHandler(); } } }