【问题标题】:Proxy or FiddlerCore代理或 FiddlerCore
【发布时间】: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


【解决方案1】:

这里要清楚一点,FiddlerCore 在线程池线程上处理每个 Session。如果您需要阻塞行为,则无需启动额外的线程或类似的东西。如果您不需要以阻塞方式处理事物,则可以随意将数据排队到后台队列中,并使用任务或其他异步机制来执行处理。

您应该准确解释您说 damage my surfing speed a great deal 时的意思,以及您在使用 Fiddler 而不是您的应用程序时是否看到不同的行为。

【讨论】:

  • 感谢大师 Eric,我的问题是当我添加这一行 System.Threading.Thread.Sleep(10000);互联网停止 10 秒。当我评论那条线时。互联网开始几乎正常工作
  • 但是@L.B 做对了。 BlockingCollection 按要求工作
  • @Ran:绝对没有合理的解释,除非您的代码中某处存在一些同步错误。会话在后台线程上处理。
  • 那就太奇怪了。我试图让我的代码尽可能的精简,所以我几乎所有的代码都被发布了。你测试过我的代码并且它对你有用吗? p.s.出于另一个奇怪的原因,我不能用'@'字符'at'你的名字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
相关资源
最近更新 更多