【问题标题】:How to use Fiddler with HttpClient?如何将 Fiddler 与 HttpClient 一起使用?
【发布时间】:2016-07-16 14:18:14
【问题描述】:

我知道有很多关于此的问题/答案、博客,而不是关于 Telerik 的常见问题解答。我仍然无法以清晰纯粹的方式诊断和解决这个问题:

上下文:

我有一个 Web API 应用程序,我有一个(单元测试)客户端,它使用 HttpClient 向 API 发送请求。 Web API 应用程序在 http://localhost:8631/ 中侦听 有时我使用 Fiddler 来查看发生了什么。

问题:

我的 HttpClient 和 Web API 之间的流量没有被 Fiddler 捕获。启动 Fiddler 后流量仍然可以,但 Fiddler 中没有显示。

目前的诊断:

  • 重要提示:使用任何浏览器并向http://localhost:8631/发送请求正在工作,我的意思是:Fiddler 捕获的流量
  • 明确配置 HttpClient 以使用 Fiddler 作为代理没有帮助。
  • 将 HttpClient url 从 http://localhost:8631/ 更改为 http://localhost.fiddler:8631/帮助,无论是否配置了代理。

结论: 至少我的情况是:这与 HttpClient 是否被明确配置为使用 Fiddler 作为代理无关。这是关于 HttpClient 和/或 Fiddler 的 localhost 行为。

再次发出:

有人可能会问:问题解决了,那么问题是什么?嗯……

Q1:这仍然是一个痛苦的问题,因为 url 在某处被编码或配置(我的意思是http://localhost:8631/ http://localhost.fiddler:8631 所以每次启动和停止提琴手都必须更新。更多:签入源代码到源代码控制,并由队友在另一台机器上签出可能会导致问题。所以:是否有任何不那么痛苦的解决方法这个?

在团队中工作和使用源代码控制时,硬编码我的机器名称(这也可以工作)会导致同样的痛苦和问题

Q2:为什么会出现这种不一致的行为:Pure http://localhost:8631/ 适用于任何浏览器,但不适用于 HttpClient。

我认为回答 Q2 可以让我们更接近更有用的解决方法。

代码展示

    // Using the following url  w o r k s  regardless of any proxy setting
    // ...but it is a pain to hardcode or configure this and change    depending on Fiddler is running or not

    //private const string ApiUrl = "http://localhost.fiddler:8631/"; 

    // This is not working regardless any proxy setting. Trafic bypasses Fiddler
    private const string ApiUrl = "http://localhost:8631/";

    protected HttpClient GetClient()
    {
        var httpClientHandler = new HttpClientHandler
        {
            // Does not work 
            //Proxy = new WebProxy("http://localhost:8888", false),

            // Does not work
            Proxy = WebRequest.DefaultWebProxy,
            UseProxy = true
        };


        var client = new HttpClient(httpClientHandler)
        {
            BaseAddress = new Uri(ApiUrl)
        };
        // ...

【问题讨论】:

  • 不需要通过 HttpClient 使用 Fiddler。 Fiddler 设置/重置默认操作系统代理,因此您不需要修改任何应用程序来使用它。只有当您...摆弄代理设置或在 Fiddler 有机会重置操作系统代理之前终止 Fiddler(例如通过关闭),您才会遇到问题
  • 为了获得特定问题的帮助,您需要发布实际代码,包括对 app.config 中 system.net 代理设置的任何修改
  • 您是否尝试过适用于 .NET 的提琴手文档? docs.telerik.com/fiddler/Configure-Fiddler/Tasks/…
  • @PhilCooper:这就是我试图不做的事情,因为这很痛苦:“硬编码(在代码或配置中)一个明确的代理设置(对提琴手或我的机器名称)。”这是痛苦的 a) 源代码控制/团队考虑,b) 因为您必须在启动 fiddler 或停止 fiddler 时始终切换。

标签: c# fiddler dotnet-httpclient


【解决方案1】:

问题在于,WebProxy 类的 Microsoft 实现对环回 url 进行了静态检查(基于“localhost”之类的名称列表),并将绕过任何标识为环回的 uri 代理。即使是BypassProxyOnLocal 设置也无关紧要。仅当您使用本地机器名称或本地网络中的其他机器名称时,此设置才有效。主机 localhost 或 ip 地址 127.0.0.1 总是被识别为环回并会导致绕过代理。

.net 框架代码的相关部分在WebProxy.IsBypassedManual:

if (host.IsLoopback) {
    return true; // bypass localhost from using a proxy.
}

编写您自己的 WebProxy 类的后代并覆盖 GetProxyIsBypassed 方法以使用代理返回一个 uri,即使对于环回 url。然后将该类的一个实例分配给您用来创建HttpClientHttpClientHandler

似乎不起作用,因为 .net 代码希望与实现 IAutoWebProxy 的对象一起使用,但 IAutoWebProxy 被声明为内部的,不能在我们自己的代码中使用。

我看到的最简单的解决方案是在运行时将“localhost”替换为 ApiUrl 中的本地计算机名称。无论 Fiddler 是否正在运行,本地计算机名称都将起作用。

【讨论】:

  • 我使用 machinename - fiddler 仍然忽略我对本地和基于 Web 的 Web 服务的 httpclient 调用?!
  • @niico 开始一个新问题,详细说明您的代码。也许您有阻止客户端使用任何代理的代码,或者您自己设置了特定的代理?
【解决方案2】:

只需为您的 HttpClient 实例定义默认代理,它就可以像魅力一样工作。您不必更改代码中的任何 URL。

HttpClientHandler handler = new HttpClientHandler( );
handler.Proxy = WebRequest.DefaultWebProxy;
HttpClient client = new HttpClient( handler as HttpMessageHandler );

我们使用相同的行为没有任何问题(Windows 10、Fiddler4)。

【讨论】:

  • 谢谢,试过了。不幸的是,这无济于事。请注意,在我写的诊断部分中,甚至明确地将代理设置为 Fiddler 也无济于事。但是使用 localhost.fiddler 而不是 localhost 会有所帮助。在浏览器中使用时的奇怪之处在于它也可以在没有 .fiddler 域的情况下使用
  • @g.pickardou 您的代理是 SOCK 还是 HTTP 代理?通常 Fiddler 应该创建一个 HTTP 代理。我们使用 HTTP 代理,这在所有机器上都 100% 有效。也适用于使用企业代理的客户。
  • 我根本没有代理。 Fiddler 在运行时是一个代理。
猜你喜欢
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多