【发布时间】: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