我知道有很多关于这个问题的问题/答案、博客,不谈 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),所以每次启动和停止 Fiddler 都必须更新它。 更多:将其检入源代码控制中,并由队友在其他计算机上进行检查可能会导致问题。 因此:是否有任何更少痛苦的解决方法?
硬编码我的机器名称(也可能起作用)会在团队合作并使用源代码控制时引起同样的痛苦和问题。
Q2:为什么这种不一致的行为:纯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)
};
// ...