除非使用 Fiddler,否则 HTTP 请求性能不佳

Poor HTTP request performance unless using Fiddler

编辑:在与几个 IT 人员讨论后,我意识到只有 POLL 请求有问题。我正在通过 GET 请求获取图像,无论 POLL 消息是否有问题,这些请求都按预期快速通过。

我正在使用 C# 开发客户端以连接 IP 摄像机。

除了当我不使用 Fiddler(网络流量检查代理)时我的 http 请求性能真的很差之外,一切都很好。

我正在使用 httpclient 发送我的请求,这是我实际发起轮询请求的代码:

public async Task<bool> SetPoll(int whichpreset)
    {
        string action = "set";
        string resource = presetnames[whichpreset];
        string value = presetvalues[whichpreset];
        int requestlen = 24 + action.Length + resource.Length + value.Length;

        var request = new HttpRequestMessage
        {
            RequestUri = new Uri("http://" + ipadd + "/res.php"),
            Method = HttpMethod.Post,

            Content = new FormUrlEncodedContent(new[]{
                new KeyValuePair<string,string>("action",action),
                new KeyValuePair<string,string>("resource",resource),
                new KeyValuePair<string,string>("value",value)
            }),
            Version = new System.Version("1.1"),

        };
        HttpResponseMessage mess = await client.SendAsync(request);
        if (mess.IsSuccessStatusCode)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

当 Fiddler 启动时,我的所有 http 请求都会快速顺利地通过(我在连接时发出了大约 20 post 请求)。没有它,它们只会按预期完成大约 1/5 的时间,而其余时间它们永远不会完成,这是一个大问题。另外,在不使用Fiddler的情况下,初始连接请求通常需要1分钟以上,而我使用时始终只需要几秒钟,所以连接后太快发送请求似乎不是时间问题。

这让我认为所写的请求表现相当差,也许 Fiddler 的请求表现得更好。我是 HTTP 的新手,所以我不确定为什么会这样。我的问题:

  1. Fiddler 是否修改 HTTP 请求(例如不同 headers,等等) 当它们被发送到服务器时?
  2. 即使不修改请求,Fiddler的请求是否在 比我在 C# 中退出 .net 4.0 更好的方式 VS2013?
  3. 有没有办法改善我的模拟请求行为 Fiddler 在做什么?理想情况下,同时仍在工作 库存 HTTP 名称空间,但如果需要,我愿意使用其他名称空间。

如果有帮助,我会很乐意提供更多代码(尽管明天)。

Fiddler 将自己安装为系统代理。 Fiddler 进程可能比您的应用程序进程更能访问网络。

  • Fiddler 可能配置为绕过您的普通系统代理(检查选项下的网关选项卡),并且普通系统代理可能有问题。

  • Fiddler 可能 运行 作为具有不同网络配置文件的不同用户,例如可能正在使用不同的用户证书存储或不同的代理设置,例如排除列表。

  • Fiddler 可能配置为 override your hosts file 并且您的主机文件可能包含错误。

  • 您的计算机可能在尝试访问 check for certificate revocation 所需的服务器时超时。 Fiddler 默认禁用 CRL 检查(检查 HTTPS 选项卡)。

Fiddler 有很多选项,以上只是一些猜测。

我的建议是检查 and/or 切换以上选项以查看它们是否适用。如果你无法到达任何地方,你可能不得不忘记 Fiddler 的存在并独立解决你的网络问题,例如通过使用 NSLOOKUP、PING、TRACERT 和可能的 TELNET 来隔离问题。

您的代码示例中没有任何内容表明存在可能导致您所描述的那种间歇性网络故障的代码缺陷。事实上,很难想象任何代码缺陷会导致这种行为。

插入

await Task.Delay(50);

在所有请求之间解决了问题(我还没有在不同的延迟下进行测试)。因为 Fiddler 解决了这个问题,我怀疑这是相机的问题,因为连续发送请求的速度太快,而 fiddler 以更可容忍的速度发送它们。因为它是异步等待,所以没有明显的性能影响,除了在启动时需要一些时间来完成所有 ~20(现在 30)个请求,这对我的应用程序来说不是问题。