攔截請求需要實現兩個接口
- IRequestHandler 對請求進行自定義處理
- IResponseFilter 對response進行處理
cef官方文檔
實現了IRequestHandler 以后需要給瀏覽器綁定
例:
broswer.RequestHandler = new CEFRequestHandler();
tips:
- 在request中的GetResourceResponseFilter方法進行檢測
public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
var url = new Uri(request.Url);
if (url.AbsoluteUri.Contains("http://www.baidu.com"))
{
//自定義的IResponseFilter,這里是按照官方文檔的示例
var filter = CEFFilterManger.CreateFilter(request.Identifier.ToString());
return filter;
}
return null;
}
IResponseFilter
public abstract class CEFResponseHandle : IResponseFilter
{
public string URI { get; set; }
public List<byte> dataAll = new List<byte>();
public string DataStr
{
get
{
return Encoding.UTF8.GetString(dataAll.ToArray());
}
}
public void Dispose()
{
}
public abstract void Invoke();
public FilterStatus Filter(Stream dataIn, out long dataInRead, Stream dataOut, out long dataOutWritten)
{
try
{
if (dataIn == null || dataIn.Length == 0)
{
dataInRead = 0;
dataOutWritten = 0;
//string resultResponse = System.Text.Encoding.UTF8.GetString(dataAll.ToArray());
//try
//{
// JsonOper.ToObject<Dictionary<string, object>>(DataStr);
//}
//catch (Exception e)
//{
// return FilterStatus.NeedMoreData;
//}
return FilterStatus.Done;
}
//解決Transfer-Encoding: chunked數據不全的問題
if (dataIn.Length > dataOut.Length)
{
var data = new byte[dataOut.Length];
dataIn.Seek(0, SeekOrigin.Begin);
dataIn.Read(data, 0, data.Length);
dataOut.Write(data, 0, data.Length);
dataInRead = dataOut.Length;
dataOutWritten = dataOut.Length;
dataAll.AddRange(data);
}
else
{
dataInRead = dataIn.Length;
dataOutWritten = Math.Min(dataInRead, dataOut.Length);
dataIn.CopyTo(dataOut);
dataIn.Seek(0, SeekOrigin.Begin);
byte[] bs = new byte[dataIn.Length];
dataIn.Read(bs, 0, bs.Length);
dataAll.AddRange(bs);
dataInRead = dataIn.Length;
dataOutWritten = dataIn.Length;
}
return FilterStatus.NeedMoreData;
}
catch (Exception ex)
{
dataInRead = dataIn.Length;
dataOutWritten = dataIn.Length;
return FilterStatus.Done;
}
}
public bool InitFilter()
{
return true;
}
}