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可以让我们更接近一个更有用的解决方法.

代码展示

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

.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是否正在运行,本地机器名称都将工作.

猜你在找的C#相关文章