gpt4 book ai didi

cefsharp - 使用 CefSharp 捕获资源响应数据(正文)

转载 作者:行者123 更新时间:2023-12-04 03:09:28 35 4
gpt4 key购买 nike

我正在尝试使用 CefSharp 访问 URL 并捕获在加载给定页面期间检索到的特定资源。大概作为每个资源的流或字节数组。

CefSharp 提供接口(interface) IRequestHandler。您可以创建一个实现此接口(interface)的类来响应请求/响应事件,但它不以任何方式包含响应主体。

最佳答案

看看GetResourceResponseFilter在您的 IRequestHandler 的实现中. GetResourceResponseFilter返回 IResponseFilter ,这为您提供了捕获所有响应的机会。您需要实现自己的 IResponseFilter ,幸好有很多例子。
Example IResponseFilter实现取自 CefSharp GitHub 项目。

public class MemoryStreamResponseFilter : IResponseFilter
{
private MemoryStream memoryStream;

bool IResponseFilter.InitFilter()
{
//NOTE: We could initialize this earlier, just one possible use of InitFilter
memoryStream = new MemoryStream();

return true;
}

FilterStatus IResponseFilter.Filter(Stream dataIn, out long dataInRead, Stream dataOut, out long dataOutWritten)
{
if (dataIn == null)
{
dataInRead = 0;
dataOutWritten = 0;

return FilterStatus.Done;
}

dataInRead = dataIn.Length;
dataOutWritten = Math.Min(dataInRead, dataOut.Length);

//Important we copy dataIn to dataOut
dataIn.CopyTo(dataOut);

//Copy data to stream
dataIn.Position = 0;
dataIn.CopyTo(memoryStream);

return FilterStatus.Done;
}

void IDisposable.Dispose()
{
memoryStream.Dispose();
memoryStream = null;
}

public byte[] Data
{
get { return memoryStream.ToArray(); }
}
}
现在在您的 GetResourceResponseFilter方法:
 private Dictionary<ulong, MemoryStreamResponseFilter> responseDictionary = new Dictionary<ulong, MemoryStreamResponseFilter>();
public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
var dataFilter = new MemoryStreamResponseFilter();
responseDictionary.Add(request.Identifier, dataFilter);
return dataFilter;
}
然后在 OnResourceLoadComplete :
public void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
{
MemoryStreamResponseFilter filter;
if (responseDictionary.TryGetValue(request.Identifier, out filter))
{
var data = filter.Data; //This returns a byte[]
//File.WriteAllBytes("c:/save/path", data);
}
}
您可以使用 IRequest 中的属性。和 IResponse参数来决定要过滤的内容。

关于cefsharp - 使用 CefSharp 捕获资源响应数据(正文),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45816851/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com