如何在.net 5中将HttpClient绑定到一个特定的(源)ip地址



根据问题#1793,不应该使用像这样的怪事来绑定。net 5中的HttpClient到特定的本地ip地址。

然而,我完全被这个话题淹没了,因为。net Core开发人员多年来没有能力为。net Core提供选择http请求的输出ip地址的选项。即使是向后兼容的WebClient也不能在早期的。net Core版本中做到这一点,其他任何高级HTTP API也不能做到这一点。上帝(或任何人)赞美。net 5,它应该(希望?)将这些功能带回现代。net框架。

如何配置HttpClient对象,仅使用。net 5中的板载方法为传出连接选择特定的本地ip地址?还是不可能?附加问题:如何配置ClientWebSocket对象,仅使用。net 5中的板载方法为传出连接选择特定的本地ip地址?

在我的设置中,计算机有多个ip地址,我访问的服务基于源ip地址有相当严格的速率限制。

请不要告诉我,操作系统将选择正确的适配器或ip地址来使用。请不要把我送到第三方图书馆。是的,即使他们在这方面修复了WebClient,我也不想使用它。

其他感兴趣的问题:

  • #23267: HttpClient指定接口绑定/从
  • 发出请求
  • #28721:在SocketsHttpHandler (aka自定义拨号器)上添加ConnectCallback

。.NET Core和。NET 5都支持各种HttpHandlerSocketsHttpHandler用于配置HttpClient以使用。net内部套接字实现(不依赖于WinHttp)。

从。net 5开始,您可以使用SocketsHttpHandlerConnectCallback来配置如何建立连接,如下所示:

public static HttpClient GetHttpClient(IPAddress address)
{
if (IPAddress.Any.Equals(address))
return new HttpClient();
SocketsHttpHandler handler = new SocketsHttpHandler();
handler.ConnectCallback = async (context, cancellationToken) =>
{
Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(address, 0));
socket.NoDelay = true;
try
{
await socket.ConnectAsync(context.DnsEndPoint, cancellationToken).ConfigureAwait(false);
return new NetworkStream(socket, true);
}
catch
{
socket.Dispose();
throw;
}
};
return new HttpClient(handler);
}

相关内容

  • 没有找到相关文章

最新更新