如何在.NET 5中将HttpClient绑定到特定的(源)IP地址

6
根据问题 #1793,在.NET 5中不应该需要使用这样的强制手段来绑定HttpClient到特定的本地IP地址。
然而,现在的.NET Core开发者已经多年无法实现在.NET Core中选择http请求的出站IP地址。即使向后兼容的WebClient也无法在早期版本的.NET Core中做到这一点,任何其他高级别的HTTP API也无法实现这一点。谁(或者其他什么)赞扬.NET 5,它应该(希望?)将这些功能带回一个现代化的.NET框架。 我如何使用.NET 5的内置方法配置HttpClient对象,以仅为出站连接选择特定的本地IP地址?还是这仍然不可能?附加问题:我如何使用.NET 5的内置方法配置ClientWebSocket对象,以仅为出站连接选择特定的本地IP地址?
在我的设置中,计算机具有多个IP地址,并且我要访问的服务基于源IP地址有相当严格的速率限制。 请不要告诉我操作系统会选择正确的适配器或IP地址来使用。请不要将我发送到第三方库。是的,即使他们在这方面修复了WebClient,我也不想使用它。 其他感兴趣的问题: - #23267:HttpClient指定要绑定到/从中进行请求的接口 - #28721:在SocketsHttpHandler(又名自定义拨号程序)上添加ConnectCallback
1个回答

10

.NET Core和因此也是.NET 5支持各种HttpHandler,其中SocketsHttpHandler用于配置HttpClient以使用.NET内部socket实现(而不是依赖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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接