繁体   English   中英

将不同 URL 的 HTTP 请求名称解析缓存到同一主机。 可能吗?

Cache HTTP request name resolution for different URLs to same host. Possible?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

问题摘要:我需要调用 HTTP 资源 A,同时使用从先前 HTTP 请求到同一主机上的资源 B 的名称解析。

案例 1. 对同一资源的连续调用在第一次调用后产生更快的结果。 Profiler 告诉我,第一次和第二次调用之间的区别在于 DNS 名称解析 (GetHostAddresses) 在此处输入图片说明

var request = (HttpWebRequest)WebRequest.Create("https://www.somehost.com/resources/b.txt");
using (var response = (HttpWebResponse)request.GetResponse()) {}

var request = (HttpWebRequest)WebRequest.Create("https://www.somehost.com/resources/b.txt");
using (var response = (HttpWebResponse)request.GetResponse()) {}

情况 2. 对同一主机上不同资源的连续调用产生相同的延迟。 Profiler 告诉我,它们都会调用 DNS 名称解析。

var request = (HttpWebRequest)WebRequest.Create("https://www.somehost.com/resources/a.txt");
using (var response = (HttpWebResponse)request.GetResponse()) {}

var request = (HttpWebRequest)WebRequest.Create("https://www.somehost.com/resources/b.txt");
using (var response = (HttpWebResponse)request.GetResponse()) {}

我想知道为什么如果 2 秒调用不能从第一次调用开始使用 DNS 缓存? 它是同一个主机。

主要问题 - 如何改变?

编辑上述行为还涵盖了 HttpClient 类的使用。 看来这是我使用的少数网络服务器所特有的,并且这个问题在其他服务器上不会发生。 我无法弄清楚具体发生了什么,但我怀疑有问题的网络服务器(Amazon CloudFront 和 Akamai)在提供服务后强制关闭连接,忽略我的请求保持活动标头。 我现在要结束这个,因为不可能有意识地提出一个问题..

1 个回复

System.Net.Http.HttpClient不存在您的问题,请改用它。 它可以重用现有的连接(此类调用不需要 DNS 缓存)。 看起来这正是您想要实现的目标。 作为奖励,它支持 HTTP/2(可以在HttpClient实例创建时通过属性分配启用)。

WebRequest是古老的,Microsoft 不推荐用于新开发。 在 .NET 5 HttpClient中更快(两倍?)。

为每个应用程序创建一次HttpClient实例( 链接)。

private static readonly HttpClient client = new HttpClient();

模拟您的请求。 注意await仅在标记为async方法中可用。

string text = await client.GetStringAsync("https://www.somehost.com/resources/b.txt");

您也可以一次执行多个请求而不会产生并发线程。

string[] urls = new string[]
{ 
    "https://www.somehost.com/resources/a.txt",
    "https://www.somehost.com/resources/b.txt"
};
List<Task<string>> tasks = new List<Task<string>>();
foreach (string url in urls)
{
    tasks.Add(client.GetStringAsync(url));
}
string[] results = await Task.WhenAll(tasks);

如果您不熟悉异步编程,例如async/await ,请从本文开始。

您还可以设置一次处理多少请求的限制。 让我们做 1000 次相同的请求,一次限制为 10 个请求。

static async Task Main(string[] args)
{
    Stopwatch sw = new StopWatch();
    string url = "https://www.somehost.com/resources/a.txt";
    using SemaphoreSlim semaphore = new SemaphoreSlim(10);
    List<Task<string>> tasks = new List<Task<string>>();
    sw.Start();
    for (int i = 0; i < 1000; i++)
    {
        await semaphore.WaitAsync();
        tasks.Add(GetPageAsync(url, semaphore));
    }
    string[] results = await Task.WhenAll(tasks);
    sw.Stop();
    Console.WriteLine($"Elapsed: {sw.Elapsemilliseconds}ms");
}

private static async Task GetPageAsync(string url, SemaphoreSlim semaphore)
{
    try
    {
        return await client.GetStringAsync(url);
    }
    finally
    {
        semaphore.Release();
    }
}

你可以测量一下时间。

1 根据请求名称空间解析URL

我正在使用DjangoCMS构建一个网站,该网站具有大约10个同一应用程序实例。 这些不同的实例将仅用于在不同页面上提供不同的文件。 一切正常,除了当我转到应用程序的其他实例并转到详细信息视图时,它还原为原始应用程序的URL和名称空间。 例如,转到/university/term- ...

2 节点js获取HTTP请求名称

我看到即使我也只是尝试执行GET,PUT命令也会被执行。 有什么我缺少的基本知识吗? 我需要做的是我的程序应基于方法读取所有标头。 ...

2012-10-25 06:52:16 1 63   node.js
4 如何在Jmeter中更改或参数化HTTP请求名称?

如何在每次迭代中更改HTTP请求名称? 场景:我正在运行一个用户测试进行1000多次迭代,当我借助GUI运行时,我可以查看结果,但采样器名称在1000多次迭代中没有变化。 我的HTTPS请求名称如下: GetSpace-接下来的1000个项目 当我运行测试时,“查看 ...

6 将变量放入请求名称

有什么方法可以将我的环境变量放在 Postman 中的请求名称中吗? 我在请求名称中尝试过这个,但它不起作用: 谢谢 ...

7 chrome 开发工具网络请求名称

有谁知道在 chrome dev tools plz 中显示完整网络资源请求 url 而不仅仅是它的最后一部分的方法? 现在它只向我显示资源 url 的最后一部分: 1或2用于对/users/1和/users/2请求。 由于我有多个以/:id结尾的资源网址,这很快就会让人感到困惑。 当我将鼠标悬 ...

8 HttpClient将请求缓存到同一个URL

在Xamarin iOS上。 我正在使用HttpClient来获取JSON字符串。 问题是,如果我查询相同的URL,它会忽略更新并给我相同的JSON响应。 我希望它不缓存任何东西,并且总是实际查询URL并给我新的响应。 这听起来微不足道,必须有一个简单的方法。 我正在使用Forms ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM