【问题标题】:Can't capture traffic with FiddlerCore with mobile user-agent in a Windows service无法在 Windows 服务中使用带有移动用户代理的 FiddlerCore 捕获流量
【发布时间】:2014-10-31 12:06:05
【问题描述】:

我有一个 .NET Windows 服务,它使用 fiddler 核心从一组网站捕获内容。我用Process.Start("IEXPLORE.EXE", url) 启动Internet Explorer,它可以工作。问题是我需要比较桌面上网和手机上网的内容。我试图更改 Internet Explorer 的用户代理但没有成功。我的下一个想法是使用带有User-Agent Switcher 的Chrome 来模拟移动冲浪。这样做的问题是我无法让 fiddler 核心使用服务从 Chrome 捕获任何数据(无论用户代理切换器如何)。在控制台应用程序中一切正常,但服务没有捕获任何内容。我假设这不应该是“会话 0 隔离”问题,因为 Fiddler 和 Chrome 在同一个会话(服务用户的会话)中运行。 FiddlerCore 的版本是 4.4.0.1。

这是捕获数据的代码:

    public class TrafficEvent
    {
        public string Url { get; set; }
        public string ContentType { get; set; }
        public byte[] Data { get; set; }
    }

    private List<TrafficEvent> trafficEvents;
    private Fiddler.SessionStateHandler responseHandler;

    private void HandleBeforeResponse(Fiddler.Session session)
    {
        trafficEvents.Add(new TrafficEvent
        {
            Url = session.fullUrl,
            ContentType = session.oResponse.headers.Exists("Content-Type") ? session.oResponse.headers["Content-Type"] : "",
            Data = session.responseBodyBytes
        });
    }

    public void StartFiddler()
    {
        trafficEvents = new List<TrafficEvent>();
        responseHandler = new Fiddler.SessionStateHandler(HandleBeforeResponse);
        Fiddler.FiddlerApplication.BeforeResponse += responseHandler;

        Fiddler.WinINETCache.ClearFiles();
        Fiddler.CONFIG.IgnoreServerCertErrors = false;

        int port = 8888;
        Fiddler.URLMonInterop.SetProxyInProcess("127.0.0.1:" + port.ToString(), "<-loopback>");
        Fiddler.FiddlerApplication.Startup(port, true, false);
    }

    public List<TrafficEvent> StopFiddler()
    {
        Fiddler.FiddlerApplication.BeforeResponse -= responseHandler;
        Fiddler.FiddlerApplication.Shutdown();
        return trafficEvents;
    } 

    public async Task CaptureData(string url)
    {
        StartFiddler();

        var proc = Process.Start("chrome.exe", url);
        proc.EnableRaisingEvents = true;
        await Task.Delay(30 * 1000);
        proc.Kill();

        List<TrafficEvent> trafficEvents = StopFiddler();

        foreach (TrafficEvent trafficEvent in trafficEvents)
        {
            // Store event in database
        }
    }

编辑: 无法评论 EricLaw 的答案。

@EricLaw 不幸的是,Chrome 的代理开关不适用于该服务。之前我曾尝试在配置文件中设置代理:

<!-- The following section is to force use of Fiddler for all applications, including those running in service accounts -->
<system.net>
    <defaultProxy>
        <proxy autoDetect="false" bypassonlocal="false" proxyaddress="http://127.0.0.1:8888" usesystemdefault="false" />
    </defaultProxy>
</system.net>

那也没用。通过 Fiddler 更改用户代理在 Windows.Forms.WebControl 上效果很好,但在 Internet Explorer 或 Chrome 上效果不佳。我目前正在将服务作为应用程序运行,这不是最佳的,但现在可以工作。将尝试 UA Pick,谢谢。

解决方案 我最初的问题是无法从手机中捕获数据。它是 Chrome 还是 Internet Explorer 并不重要。感谢@EricLaw 的回答,我在 IE 中使用了 UA-pick,它适用于在服务中捕获移动网站!

【问题讨论】:

  • 不启动一个成熟的浏览器进程,而是使用像 Selenium 这样的网络驱动程序怎么样?
  • @CodeCaster 感谢您的提示。有可能我会尝试。如果可能的话,我想尝试让它与成熟的浏览器一起工作,因为我尝试过的其他方法无法捕获所有内容(例如 Windows 窗体 WebControl、Windows Phone 模拟器)。

标签: c# google-chrome windows-services fiddler fiddlercore


【解决方案1】:

首先,请记住,您可以更改使用 Fiddler 本身发送的 User-Agent 标头。或者,您可以使用我的 UA Pick 插件。

如果您想继续使用 Chrome 路由,您遇到的问题是 服务帐户 不能保证检查活动的 用户帐户 代理设置,这是 Fiddler 默认注册为代理的地方。

最简单的方法是使用指向代理服务器的命令行启动 Chrome,例如chrome.exe --proxy-server=127.0.0.1:8888

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多