语境:
我有一个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可以让我们更接近一个更有用的解决方法.
代码展示
// 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) }; // ...
解决方法
.net框架代码的相关部分是WebProxy.IsBypassedManual
:
if (host.IsLoopback) { return true; // bypass localhost from using a proxy. }
编写您自己的WebProxy类的后代,并覆盖GetProxy和IsBypassed方法,以便使用代理即使为环回url也返回一个uri.然后将该类的实例分配给您用于创建HttpClient的HttpClientHandler.
似乎没有工作,因为.net代码期望使用实现IAutoWebProxy的对象,但是IAutoWebProxy被声明为内部的,不能在我们自己的代码中使用.
我看到的最简单的解决方案是在运行时将一个功能替换为ApiUrl中本地计算机名称的“localhost”.无论Fiddler是否正在运行,本地机器名称都将工作.