Werfen Sie einen Blick auf GetResourceResponseFilter
in Ihrer Implementierung von IRequestHandler
. GetResourceResponseFilter
gibt eine IResponseFilter
zurück, die Ihnen die Möglichkeit bietet, alle Antworten zu erfassen. Sie müssen Ihre eigenen IResponseFilter
implementieren, zum Glück gibt es reichlich Beispiele.
ExampleIResponseFilter
Implementierung aus dem GitHub-Projekt CefSharp
übernommen.
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(); }
}
}
Jetzt in Ihrem GetResourceResponseFilter
Methode:
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;
}
Dann in 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);
}
}
Sie können die Eigenschaften innerhalb der IRequest
und IResponse
Parameter verwenden, um zu beurteilen, was Sie filtern möchten.
Danke für die Rückmeldung und Beispiele TEK. Ich bin jetzt viel näher an meiner endgültigen Lösung. Ich hatte die IResponseFilter-Klasse bereit, wusste aber nicht, wie/wo ich sie verwenden sollte. Ich frage mich nur, warum die bestimmte Ressource, nach der ich suche, niemals im OnResourceLoadComplete-Ereignis auftaucht. Ich vermute, es ist ein Javascript-Post auf dem Server. Irgendwelche speziellen benötigt, um diese zu erfassen? Ich kann sie alle in den Chrome-Entwicklertools beim Surfen auf der Website sehen. –
@FritsDonkerbroek Es sollte alles erfassen. Sie können versuchen, ein einfaches 'if (response.ResourceType == ResourceType.Xhr)' hinzuzufügen, das die 'XMLHttpRequest' (die ich vermute, was Sie wollen) fangen sollte. Wenn dies der Fall ist, müssen Sie das "responseDictionary" regelmäßig abfragen, da 'OnResourceLoadComplete' jedes Mal ausgelöst wird, wenn eine Ressource geladen wird (einschließlich einer dynamischen' Xhr'). Sie können auch auf "response.ResponseHeaders" schauen und sehen, ob Sie zu Ihnen zurückkommen. – TEK
Ja, es sind Xhr-Daten, nach denen ich suche. Ich habe die URLs für die Xhr-Anfragen protokolliert und sehe einige von denen, die ich in Chrome Dev Tools sehe, aber nicht die, nach denen ich suche. Bis heute ist das einzige, was ich gefunden habe, das diese speziellen Daten erfasst, SlimerJs, was nicht ideal ist. Ich werde weiter herum graben, aber ich vermute, dass dies eine verlorene Sache ist. Danke nochmal für die Hilfe. –