根据问题#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都支持各种HttpHandler
。SocketsHttpHandler
用于配置HttpClient
以使用。net内部套接字实现(不依赖于WinHttp)。
从。net 5开始,您可以使用SocketsHttpHandler
的ConnectCallback
来配置如何建立连接,如下所示:
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);
}