C# 为什么HttpClient使用HTTPS比HTTP快得多?

C# 为什么HttpClient使用HTTPS比HTTP快得多?,c#,.net,http,https,dotnet-httpclient,C#,.net,Http,Https,Dotnet Httpclient,前几天,我在调查一个奇怪的bug,在这个bug中,规范化URL会导致我的应用程序大幅减速300%: if (!TryNormalize(uri, out uri)) throw new ArgumentException("URL is not a valid YouTube URL!"); string pageSource; using (var http = new HttpClient()) pageSource = await http.GetStringAsync

前几天,我在调查一个奇怪的bug,在这个bug中,规范化URL会导致我的应用程序大幅减速300%:

if (!TryNormalize(uri, out uri))
    throw new ArgumentException("URL is not a valid YouTube URL!");

string pageSource;

using (var http = new HttpClient())
    pageSource = await http.GetStringAsync(uri);
当注释掉
TryNormalize
时,
GetStringAsync
大约需要0.5秒才能完成。然而,当它未注释时,下载字符串将需要2秒的时间。原来
TryNormalize
在它处理的所有URL前面加了前缀
“http://”
,并添加了一个额外的
S
解决了这个问题

既然如此,为什么会发生这种情况?据我所知,HTTPS应该更慢一些,因为在从服务器传输之前必须对字符串进行加密,而HTTP不提供这样的选项。即使我不是HTTP方面的专家,300%似乎是一个相当大的减速。我是不是遗漏了什么


编辑:源代码的
TryNormalize

public static bool TryNormalize(string videoUri, out string normalized)
{
    normalized = null;

    var builder = new StringBuilder(videoUri);

    videoUri = builder.Replace("youtu.be/", "youtube.com/watch?v=")
        .Replace("youtube.com/embed/", "youtube.com/watch?v=")
        .Replace("/v/", "/watch?v=")
        .Replace("/watch#", "/watch?")
        .ToString();

    string value;

    if (!Query.TryGetParamValue("v", videoUri, out value))
        return false;

    normalized = "http://youtube.com/watch?v=" + value; // replacing with HTTPS here results in 1.5s speedup
    return true;
}

这是因为当你使用youtube url的变化时会有很多重定向。例如,导航到
http://youtu.be/O3UBOOZw-FE
导致两个重定向。(请参阅位置标题)

一,

二,

直到您最终获得url
https://www.youtube.com/watch?v=O3UBOOZw-FE&feature=youtu.be


由于这些重定向是由
HttpClient
自动处理的,因此您只能看到3个请求的最终结果。

什么是
TryNormalize
?您是否在一个邪恶的数据包整形器后面,该整形器对https流量的优先级可能与http不同?@Eser抱歉。更新了我的样本作为回应。这基本上是一种将非标准YouTube URL(例如
watch#v=
)转换为
watch?v=
)的方法。听起来网络中有什么东西影响代码之外的性能。谢谢,回答得很好!
HTTP/1.1 302 Found
Date: Fri, 21 Aug 2015 16:52:40 GMT
Server: gwiseguy/2.0
Location: http://www.youtube.com/watch?v=O3UBOOZw-FE&feature=youtu.be
Content-Length: 0
Content-Type: text/html
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
HTTP/1.1 301 Moved Permanently
Date: Fri, 21 Aug 2015 16:52:40 GMT
Server: gwiseguy/2.0
Content-Type: text/html; charset=utf-8
X-Content-Type-Options: nosniff
Expires: Tue, 27 Apr 1971 19:44:06 EST
Content-Length: 0
Cache-Control: no-cache
X-XSS-Protection: 1; mode=block; report=https://www.google.com/appserve/security-bugs/log/youtube
Location: https://www.youtube.com/watch?v=O3UBOOZw-FE&feature=youtu.be
X-Frame-Options: SAMEORIGIN