经过长期斗争,我终于找到了工作液自己。基本的想法是编写我自己的资源处理程序以及资源处理程序工厂。
创建实现IResourceHandler的MyResourceHandler。
如果ResponseLength没有值且Stream为null(可选),请在GetResponse函数中进行解密。
创建实现IResourceHandlerFactory的MyResourceHandlerFactory。
在GetResourceHandler函数中进行解密。
初始化ChromiumWebBrowser时使用MyResourceHandlerFactory。在MyResourceHandler
样品的GetResponse功能:
public virtual Stream GetResponse(IResponse response, out long responseLength, out string redirectUrl)
{
redirectUrl = null;
responseLength = -1;
response.MimeType = MimeType;
response.StatusCode = StatusCode;
response.StatusText = StatusText;
response.ResponseHeaders = Headers;
if (ResponseLength.HasValue)
{
responseLength = ResponseLength.Value;
}
else
{
//If no ResponseLength provided then attempt to infer the length
var memoryStream = Stream as MemoryStream;
if (memoryStream != null)
{
responseLength = memoryStream.Length;
}
else
{
var absoluteFilePath = new Uri(FilePath).AbsolutePath;
var fileBytes = File.ReadAllBytes(absoluteFilePath);
if (ShouldDecrypt)
{
memoryStream = Decrypt(fileBytes);
}
else
{
memoryStream = new MemoryStream(fileBytes);
}
responseLength = memoryStream.Length;
Stream = memoryStream as Stream;
}
}
return Stream;
}
样品GetResourceHandler功能MyResourceHandlerFactory:
public virtual IResourceHandler GetResourceHandler(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request)
{
try
{
var uri = new Uri(request.Url);
var filePath = uri.AbsolutePath;
if (!File.Exists(filePath)) return null;
var mime = GetMimeType(filePath);
var fileBytes = File.ReadAllBytes(filePath);
if (ShouldDecrypt)
{
Stream decryptedStream = Decrypt(fileBytes);
return MyResourceHandler.FromStream(decryptedStream, mime);
}
Stream fileStream = new MemoryStream(fileBytes);
return MyResourceHandler.FromStream(fileStream, mime);
}
finally
{
request.Dispose();
}
}
最后如果你想知道如何初始化ChromiumWebBrowser使用MyResourceHandlerFactory:
var browser = new ChromiumWebBrowser
{
ResourceHandlerFactory = new MyResourceHandlerFactory()
};