如何解决指定 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 举报,一经查实,本站将立刻删除。