- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我知道有很多关于此的问题/答案、博客,而不是谈论 Telerik 的常见问题解答。我仍然找不到以清晰纯粹的方式诊断和解决这个问题:
上下文:
我有一个 Web API 应用程序和一个(单元测试)客户端,它使用 HttpClient 向 API 发送请求。 Web API 应用程序监听 http://localhost:8631/有时我使用 Fiddler 来查看发生了什么。
问题:
我的 HttpClient 和 Web API 之间的流量没有被 Fiddler 捕获。启动 Fiddler 后流量仍然正常,但未在 Fiddler 中显示。
到目前为止的诊断:
结论:至少我的情况是:这与 HttpClient 是否明确配置为使用 Fiddler 作为代理无关。它与 HttpClient 和/或 Fiddler 的本地主机行为有关。
再次发出:
有人会问:问题解决了,那问题是什么?嗯……
Q1: 这仍然是一个痛苦的问题,因为 url 在某处编码或配置(我的意思是 http://localhost:8631/ 或 http://localhost .fiddler:8631 所以 fiddler 的每次启动和停止都必须更新它。更多:将源代码 checkin 源代码管理,并由队友在另一台机器上 checkout 可能会导致问题。所以:是否有任何不那么痛苦的解决方法这个?
在团队中工作和使用源代码控制时,硬编码我的机器名称(这也可以工作)会导致同样的痛苦和问题
Q2: 为什么会出现这种不一致的行为:纯 http://localhost:8631/适用于任何浏览器,但不适用于 HttpClient。
我认为回答问题 2 可以让我们更接近更有用的解决方法。
代码展示
// 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)
};
// ...
最佳答案
问题是 WebProxy
类的 Microsoft 实现对环回 url 进行静态检查(基于名称列表,如“localhost”),并将绕过任何标识为环回的 uris 的代理.即使是 BypassProxyOnLocal
设置也无关紧要。此设置仅在您使用本地机器名称或本地网络中的其他机器名称时有效。主机 localhost 或 ip 地址 127.0.0.1 始终被识别为环回,将导致绕过代理。
.net 框架代码的相关部分在 WebProxy.IsBypassedManual
中:
if (host.IsLoopback) {
return true; // bypass localhost from using a proxy.
}
编写您自己的 WebProxy 类的后代并覆盖 GetProxy
和 IsBypassed
方法以使用代理返回 uri,即使对于环回 url 也是如此。然后将该类的一个实例分配给您用来创建 HttpClient
的 HttpClientHandler
。
似乎不起作用,因为 .net 代码期望与实现 IAutoWebProxy 的对象一起工作,但 IAutoWebProxy 被声明为内部的,不能在我们自己的代码中使用。
我看到的最简单的解决方案是在运行时使用 ApiUrl 中的本地机器名称替换“localhost”的功能。无论 Fiddler 是否正在运行,本地机器名称都将起作用。
关于c# - 如何将 Fiddler 与 HttpClient 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36277311/
我是一名优秀的程序员,十分优秀!