【问题标题】:Poor HTTP request performance unless using Fiddler除非使用 Fiddler,否则 HTTP 请求性能不佳
【发布时间】:2017-08-29 23:32:40
【问题描述】:

编辑:在与几个 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 请求(例如不同的标头等) 因为它们被发送到服务器?
  2. 即使不修改请求,Fiddler 的请求在 某种方式比我在 C# 中退出 .net 4.0 时表现得更好 VS2013?
  3. 有没有办法改进我的模拟请求的行为 无论提琴手在做什么?理想情况下,仍然在 库存 HTTP 命名空间,但如有必要,我愿意使用其他命名空间。

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

【问题讨论】:

  • 你能发布一个可复制、可复制和粘贴的代码吗? (仅与您的 http 代码有关)
  • 当您说“1 分钟以上”时,可能会使用秒表并获得准确的时间。恰好 30 或 60 秒后失败表明存在超时问题。
  • @JohnWu 它变化很大。可能是 30 秒,也可能是 3 分钟。此外,它永远不会失败,只是根本没有 HTTP 响应。
  • 还有@L.B 我会在几天后把它扔在那里。时间表在工作中发生了变化。它在自己的线程中调用以减少 UI 线程的负载。

标签: c# http post visual-studio-2013 fiddler


【解决方案1】:

插入

await Task.Delay(50);

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 我尝试过您的建议。我会继续四处寻找,看看是否还有其他东西。 -Fiddler 正在使用系统代理 -我在 Windows 防火墙上为我的应用程序添加了一个例外,这没有帮助,但我应该早点想到它。不确定如何查看它是否使用不同的用户证书存储,但在“连接”下它重用客户端和服务器连接 -Fiddler 没有覆盖主机 -在 Fiddler 选项的 HTTPS 选项卡中没有看到禁用 CRL 检查的选项,尽管所有交互是在 HTTP 中完成的,所以证书应该不是问题
    猜你喜欢
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多