【发布时间】:2014-06-20 15:10:14
【问题描述】:
我正在尝试编写一个捕获 HTTP 获取请求的程序。 我发现 Fiddler-core 是一个天才库,应该可以做我想做的事。
问题是,我正在尝试在 void FiddlerApplication_BeforeRequest(Session oSession) 中执行一大段代码工作,它似乎阻止了所有请求并大大损害了我的冲浪速度.
我尝试使用线程/任务无济于事。 我做错了什么?
这是我的代码:
public event RequestCapture RequestCaptured;
private CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
//...stat public function:
public void RunWatch() {
Fiddler.FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest;
Fiddler.FiddlerApplication.Startup(0, FiddlerCoreStartupFlags.Default);
}
void FiddlerApplication_BeforeRequest(Session oSession)
{
if (RequestCaptured != null)
{
CancellationToken ct = cancelTokenSource.Token;
Task.Factory.StartNew(() =>RequestCaptured(oSession.fullUrl), ct);
//Handle the event in a new thread, so the Listener will continue to listen
}
}
//close public function:
public void Close() {
try
{
FiddlerApplication.Shutdown();
cancelTokenSource.Cancel();
}
catch { }
}
现在我有不同的班级可以做到这一点:
public Form1()
{
Listiner = new HttpWatcher.Listner();
Listiner.RequestCaptured += RequestCaptured;
Listiner.RunWatch();
}
void RequestCaptured(string url)
{
System.Threading.Thread.Sleep(10000);
}
编辑 问题是:有没有更好的方法使用 fiddler-core?还是我要为此建立一个简单的代理?用别的东西?谢谢!
edit2 我已经编辑了代码,所以它会填补缺失的部分。
【问题讨论】:
-
什么是 RequestCaptured?
-
抱歉,这是一个需要大量工作的事件 :),我会在 30 分钟内发布额外的代码。对不起
-
@spender 这正是他发布的内容。
-
@PeterRitchie 不,不完全...额外的工作量(例如工作队列变得太长)。 ThreadPool 只会缓慢启动额外的线程,并且通常针对小型工作负载进行优化。将大量大型工作负载排入队列会导致大量延迟。我说的是一个专用线程,用于出队和处理队列,远离 ThreadPool。
-
@Ran 我会将 before_request 中的数据/操作放入队列(例如 BlockingCollection)并在单个单独的线程/任务中处理它们。
标签: c# .net proxy http-proxy fiddlercore