You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

223 lines
6.8 KiB
C#

9 months ago
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<string, byte[]> resources;
private string mimeType;
private MemoryStream stream;
Logger logger = null;
public CustomSchemeHandler()
{
logger = LogManager.GetLogger(this.GetType().FullName);
//这样加载非常浪费资源
resources = new Dictionary<string, byte[]>
{
};
}
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();
}
}
}