程式中有httpclient的使用,但是需要指定dns才能訪問到目標地址,我又不想改變系統的dns決議,能否做到exe程式使用自己設定的dns?
uj5u.com熱心網友回復:
你的意思是先用指定dns查詢ip,然后在用httpclient訪問特定ip??好吧
https://www.nuget.org/packages?q=dns
在這里找一款你覺著可以用的,請重視nuget,他的地位和netcore本身一樣重要。(你能遇到問題,也是大家都能遇到的問題,自然也會有人去寫對應的東西,畢竟這種要求也不是啥商業化要求,沒有啥金錢的瓜葛,俺們放nuget上就只當練手了)
uj5u.com熱心網友回復:
我找到下載第一的DnsClient,然后查詢了一下apihttps://dnsclient.michaco.net/
var endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8600); //此處為你自己指定的dns server
var client = new LookupClient(endpoint);
這樣你可以用這個指定的dns進行 lookup query查詢,即可查詢到對應私有dns的ip
當然我需要特別說明的地方,很明顯這東西是按netcore的思維和方式進行的,老外也特地向你展示了
services.AddSingleton<ILookupClient>(client);
這樣的方式,說明你可以像命名httpclient一樣的用法去用這個玩意
uj5u.com熱心網友回復:
由于博客園同學們的不作為和刻意收智商稅的玩法。我們只能去展示如何在netcore去開發了為了不跟啥asp.net core混淆,我就故意不在啥asp.net core下玩(別總一扯netcore就是啥asp.net core,啥web)
初始準備作業
1.新建netcore控制臺
2.nuget參考 Microsoft.Extensions.Hosting
3.繼續參考樓上資料DnsClient
基礎設計作業
1.首先我們可以不做任何具體實作代碼,我們先進行一些應用設計的全域構建,也就是那些人口里的架構設計,領域設計
static async Task Main(string[] args)
{
IHostBuilder hostBuilder = new HostBuilder();
hostBuilder.ConfigureServices(service =>
{
service.AddSingleton<ILookupClient>(new LookupClient(IPAddress.Parse("180.76.76.76"), 53));//我使用百度的公有DNS做測驗
service.AddSingleton<私有DnsHandler>();
service.AddSingleton<私有Dns地址Httpclient>();
service.AddHostedService<主服務入口>();
});
using (var host=await hostBuilder.StartAsync())
{
await host.WaitForShutdownAsync();
}
}
現在我們來具體實作設計:
public class 私有DnsHandler : HttpClientHandler
{
private readonly ILookupClient _lookupClient;
public 私有DnsHandler( ILookupClient lookupClient)
{
_lookupClient = lookupClient;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var host = request.RequestUri.Host;
var ips = await _lookupClient.GetHostEntryAsync(host); //通過上面定義的私有DNS查詢ip
var builder = new UriBuilder(request.RequestUri);
builder.Host = ips.AddressList.First().ToString(); //修改原始請求host到你自定義的dns查詢出的ip上面
request.RequestUri = builder.Uri; //重新構造一個新的請求uri
return await base.SendAsync(request, cancellationToken);
}
}
定義一個強型別httpclient,以便后續使用上和其他httpclient區分開
public class 私有Dns地址Httpclient
{
public HttpClient Client { get; }
public 私有Dns地址Httpclient(私有DnsHandler dnsHandler)
{
Client = new HttpClient(dnsHandler); //使用上面定義私有dns決議的handler
}
}
public class 主服務入口 : IHostedService
{
private readonly 私有Dns地址Httpclient _cutomdnsHttpclient;
public 主服務入口(私有Dns地址Httpclient CutomdnsHttpclient)
{
_cutomdnsHttpclient = CutomdnsHttpclient;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
//我這里也不做啥特殊東西,僅僅是通過自定義的dns決議后并訪問拿到結果,主要是展示怎么使用這玩意
var document = await _cutomdnsHttpclient.Client.GetStringAsync("http://www.baidu.com");
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/284204.html
標籤:C#
