我正在開發(fā)一個(gè)相當(dāng)復(fù)雜的 Xamarin.Forms 應(yīng)用程序。我們提出了很多 REST 請求。據(jù)報(bào)道,我們的應(yīng)用程序沒有及時(shí)尊重用于負(fù)載平衡的 DNS 故障轉(zhuǎn)移,因此我開始調(diào)查。我正在運(yùn)行 dnsmasq,所以我可以查看應(yīng)用程序何時(shí)發(fā)出 DNS 請求。該代碼目前正在使用HttpWebRequest,我注意到它至少間隔 10 分鐘進(jìn)行 DNS 查詢。我理解部分原因是因?yàn)榇蠖鄶?shù) .NET 網(wǎng)絡(luò)位使用 keepalive 連接。如果我強(qiáng)制標(biāo)頭不使用 keepalive,我當(dāng)然會(huì)看到更高的 DNS 查詢率,但這會(huì)增加網(wǎng)絡(luò)開銷,因此這不是理想的解決方案。但我最初并沒有看到一種明確的方法來控制如何HttpWebRequest進(jìn)行 DNS 查詢??雌饋砗苡邢M铱梢垣@得它的ServicePoint屬性并設(shè)置ConnectionLeaseTimeout它。不幸的是,這會(huì)NotImplementedException導(dǎo)致 Xamarin,因此它不會(huì)成為任何解決方案的一部分。我認(rèn)為這可能HttpClient會(huì)更可配置。我看到很多關(guān)于如何正確使用它的討論,如果你這樣做,你需要為ServicePointManager.DnsRefreshTimeout你希望 DNS 頻繁更新的用例設(shè)置一個(gè)較小的值。但這通常與獲取ServicePoint所需端點(diǎn)的 和 修改 一起完成ConnectionLeaseTimeout,這是不可能的。我一直在使用一個(gè)非常簡單的應(yīng)用程序進(jìn)行測試,該應(yīng)用程序重用 HttpClient 并在我按下按鈕時(shí)發(fā)出相同的請求。用一個(gè)按鈕將這個(gè) ViewModel 放在一些 Xaml 后面:using System;using Xamarin.Forms;using System.Net.Http;using System.Net;namespace TestDns { public class MainPageViewModel { private const string _URL = "http://www.example.com"; private HttpClient _httpClient; private ServicePoint _sp; public MainPageViewModel() { var sp = ServicePointManager.FindServicePoint(new Uri(_URL)); _sp = sp; //_sp.ConnectionLeaseTimeout = 100; // throws NIE _httpClient = new HttpClient(); ServicePointManager.DnsRefreshTimeout = 100; } public Command WhenButtonIsClicked { get { return new Command(() => SendRequest()); } } private async void SendRequest() { Console.WriteLine($"{_sp.CurrentConnections}"); var url = "http://www.example.com"; var response = await _httpClient.GetAsync(url); Console.WriteLine($"{response.Content}"); } }}沒想到ConnectionLeaseTimeout扔了 我希望這段代碼只緩存 100 毫秒的 DNS 請求,我打算在更多面向生產(chǎn)的測試中選擇一個(gè)更合理的時(shí)間范圍,比如 2-3 分鐘。但是由于我無法讓這個(gè)簡單的示例像我想要的那樣運(yùn)行,所以增加延遲似乎沒有實(shí)際意義。肯定有人在 Xamarin 應(yīng)用程序中遇到過這個(gè)問題?我唯一的解決方案是深入研究并嘗試使用本機(jī)網(wǎng)絡(luò)結(jié)構(gòu)嗎?
如何使用 Xamarin Forms 中的 HttpClient 成功減少 DNS 刷新超時(shí)?
人到中年有點(diǎn)甜
2021-08-29 17:48:54