c# – 如何使用Fiddler与HttpClient?
我知道有很多问题/答案,博客关于这一点,而不是谈论Telerik的常见问题.仍然我找不到这个诊断和解决了一个明确的纯粹的方式:
语境: 我有一个Web API应用程序,我有一个(单元测试)客户端,它使用HttpClient向API发送请求. Web API应用程序在http://localhost:8631/中监听 问题: Fiddler没有捕获我的HttpClient和Web API之间的通信.在推出Fiddler流量仍然可以,但没有在Fiddler中显示. 诊断到目前为止 >重要提示:使用任何浏览器和发送请求到http://localhost:8631/正在工作,我的意思是:Fiddler捕获的流量 结论: 再次发行: 可能会问:问题解决了,那是什么问题?好… Q1:这仍然是一个痛苦的问题,因为网址是编码或配置在某个地方(我的意思是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) }; // ... 解决方法
问题是WebProxy类的Microsoft实现对环回urls进行了静态检查(基于“localhost”这样的名称列表),并且将绕过任何被标识为loopback的uris代理.即使BypassProxyOnLocal设置也没关系.如果在本地网络中使用本地计算机名称或其他计算机名称,此设置才有效果.主机本地主机或ip地址127.0.0.1始终被识别为环回,并将导致绕过代理.
.net框架代码的相关部分是 if (host.IsLoopback) { return true; // bypass localhost from using a proxy. } 编写您自己的WebProxy类的后代,并覆盖GetProxy和IsBypassed方法,以便使用代理即使为环回url也返回一个uri.然后将该类的实例分配给您用于创建HttpClient的HttpClientHandler. 似乎没有工作,因为.net代码期望使用实现IAutoWebProxy的对象,但是IAutoWebProxy被声明为内部的,不能在我们自己的代码中使用. 我看到的最简单的解决方案是在运行时将一个功能替换为ApiUrl中本地计算机名称的“localhost”.无论Fiddler是否正在运行,本地机器名称都将工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |