【问题标题】:How to bind HttpClient to a specific (source) ip address in .NET 5如何将 HttpClient 绑定到 .NET 5 中的特定(源)IP 地址
【发布时间】:2021-01-28 02:26:09
【问题描述】:

根据issue #1793,不需要使用怪癖like this 将 .NET 5 中的 HttpClient 绑定到特定的本地 IP 地址。

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

如何配置 HttpClient 对象以仅在 .NET 5 中使用本地方法为传出连接选择特定的本地 IP 地址?还是仍然不可能? 额外问题:如何配置 ClientWebSocket 对象以仅使用 .NET 5 中的本地方法为传出连接选择特定的本地 IP 地址?

在我的设置中,计算机有多个 IP 地址,并且我正在访问的服务具有基于源 IP 地址的非常严格的速率限制。

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

其他感兴趣的问题:

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

【问题讨论】:

    标签: c# dotnet-httpclient .net-5


    【解决方案1】:

    .NET Core 和 .NET 5 也支持各种 HttpHandlers。 SocketsHttpHandler 用于配置 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      相关资源
      最近更新 更多