c# – 如何使用Fiddler与HttpClient?

前端之家收集整理的这篇文章主要介绍了c# – 如何使用Fiddler与HttpClient?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道有很多问题/答案,博客关于这一点,而不是谈论Telerik的常见问题.仍然我找不到这个诊断和解决了一个明确的纯粹的方式:

语境:

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

问题:

Fiddler没有捕获我的HttpClient和Web API之间的通信.在推出Fiddler流量仍然可以,但没有在Fiddler中显示.

诊断到目前为止

>重要提示:使用任何浏览器和发送请求到http://localhost:8631/正在工作,我的意思是:Fiddler捕获的流量
>配置HttpClient显式使用Fiddler作为代理没有帮助.
>将HttpClient url从http://localhost:8631/更改为http://localhost.fiddler:8631 / help,不管代理是否被配置.

结论:
至少我的情况:HttpClient不是明确配置为使用Fiddler作为代理.它是关于HttpClient的和/或Fiddler的本地主机行为.

再次发行:

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

Q1:这仍然是一个痛苦的问题,因为网址是编码或配置在某个地方(我的意思是http://localhost:8631/http://localhost.fiddler:8631,所以每个启动和停止的提琴者都必须更新)更多:检查源代码控制,一个队友在另一台机器上检查可能会导致问题.所以:这样做有没有什么痛苦的解决方法

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

Q2:为什么这种不一致的行为:Pure http://localhost:8631/可以从任何浏览器工作,但不能从HttpClient工作.

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

代码展示

  1. // Using the following url w o r k s regardless of any proxy setting
  2. // ...but it is a pain to hardcode or configure this and change depending on Fiddler is running or not
  3.  
  4. //private const string ApiUrl = "http://localhost.fiddler:8631/";
  5.  
  6. // This is not working regardless any proxy setting. Trafic bypasses Fiddler
  7. private const string ApiUrl = "http://localhost:8631/";
  8.  
  9. protected HttpClient GetClient()
  10. {
  11. var httpClientHandler = new HttpClientHandler
  12. {
  13. // Does not work
  14. //Proxy = new WebProxy("http://localhost:8888",false),// Does not work
  15. Proxy = WebRequest.DefaultWebProxy,UseProxy = true
  16. };
  17.  
  18.  
  19. var client = new HttpClient(httpClientHandler)
  20. {
  21. BaseAddress = new Uri(ApiUrl)
  22. };
  23. // ...

解决方法

问题是WebProxy类的Microsoft实现对环回urls进行了静态检查(基于“localhost”这样的名称列表),并且将绕过任何被标识为loopback的uris代理.即使BypassProxyOnLocal设置也没关系.如果在本地网络中使用本地计算机名称或其他计算机名称,此设置才有效果.主机本地主机或ip地址127.0.0.1始终被识别为环回,并将导致绕过代理.

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

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

编写您自己的WebProxy类的后代,并覆盖GetProxy和IsBypassed方法,以便使用代理即使为环回url也返回一个uri.然后将该类的实例分配给您用于创建HttpClient的HttpClientHandler.

似乎没有工作,因为.net代码期望使用实现IAutoWebProxy的对象,但是IAutoWebProxy被声明为内部的,不能在我们自己的代码中使用.

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

猜你在找的C#相关文章