微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指定 HTTP 请求的本地端点

如何解决指定 HTTP 请求的本地端点

我正在尝试为我需要发送的某些 HTTP 请求指定本地端点。

因此,我的设备(Wifi 和蜂窝网络)上有多个 IP,并且想在发送 HTTP 请求以从服务器获取/发布数据时选择要使用的 IP。

我了解到 HttpClient 和 .NET core 5.0 是可能的(Xamarin 不支持HttpClient specify interface to bind to / make requests from

SocketsHttpHandler socketsHttpHandler = new SocketsHttpHandler();
socketsHttpHandler.ConnectCallback = async (context,token) =>
{
    Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    s.Bind(new IPEndPoint(IPAddress.Loopback,0));
    await s.ConnectAsync(context.DnsEndPoint,token);
    s.NoDelay = true;
    return new NetworkStream(s,ownsSocket: true);
};

using (HttpClient Client = new HttpClient(socketsHttpHandler))
{
    Client.BaseAddress = new Uri("PutIPHere//");
    HttpResponseMessage Response = await Client.GetAsync("");
    // use Response as needed...
}

另一种方法是使用反射(但仅限于 .NET 框架),参见 L.B Answer

httpclienthandler SetServicePointOptions(httpclienthandler handler)
{
    var field = handler.GetType().GetField("_startRequest",BindingFlags.NonPublic | BindingFlags.Instance); // Fieldname has a _ due to being private
    var startRequest = (Action<object>)field.GetValue(handler);

    Action<object> newStartRequest = obj =>
    {
        var webReqField = obj.GetType().GetField("webRequest",BindingFlags.NonPublic | BindingFlags.Instance);
        var webRequest = webReqField.GetValue(obj) as HttpWebRequest;
        webRequest.ServicePoint.BindIPEndPointDelegate = new BindIPEndPoint(BindIPEndPointCallback);
        startRequest(obj); //call original action
    };

    field.SetValue(handler,newStartRequest); //replace original 'startRequest' with the one above

    return handler;
}

private static IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint,IPEndPoint remoteEndPoint,int retryCount)
{
    return new IPEndPoint(IPAddress.Parse("PutIPHere"),0);
}

有没有办法为 HTTP 请求指定本地终结点(使用 Xamarin)? 我想从 PLC 上做,但 android 和 iOS 原生应该没问题。 提前致谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。