如何解决使用 .NET C# HttpClient 和 IPv6 地址的正确方法
我有这个简单的 C# 代码,可以使用 IPv6 格式的 URI 向 REST 服务器发出 HTTP GET 请求:"https://[::FFFF:AC7:812]:8080"
using System;
using System.Net.Http;
namespace RestSharpIPv6
{
class Program
{
static void Main(string[] args)
{
using (var httpClientHandler = new HttpClientHandler() { ServerCertificateCustomValidationCallback = (message,cert,chain,errors) => true })
{
using (var client = new HttpClient(httpClientHandler) { BaseAddress = new Uri("https://[::FFFF:AC7:812]:8080") })
{
var result = client.GetAsync("/api/v1").Result;
Console.WriteLine(result.Content);
}
}
}
}
}
此代码仅适用于 .NET Core 5.0。如果我改用较旧的 .NET Core,例如 3.1、3.0 或 .NET Framework 4.7.2、4.6.2 等,则会收到 SocketException。
那么,使用 .NET Framework 或更旧版本的 .NET Core 将 HttpClient 与 IPv6 地址一起使用的正确方法是什么? .NET Core 5.0 有什么特别之处,但其他所有都失败了?
这是异常跟踪堆栈:
未处理的异常:System.AggregateException:发生一个或多个错误。 ---> System.Net.Http.HttpRequestException: 发送请求时出错。 ---> System.Net.WebException: 无法连接到远程服务器 ---> System.Net.Sock
ets.SocketException: 请求的地址在其上下文中无效 [::ffff:10.199.8.18]:8080
在 System.Net.Sockets.Socket.InternalEndConnect(IAsyncResult asyncResult)
在 System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
在 System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure,Socket s4,Socket s6,Socket& socket,IPAddress& address,ConnectSocketState state,IAsyncResult asyncResult,Exception& exception)
--- 内部异常堆栈跟踪结束---
在 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
在 System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
--- 内部异常堆栈跟踪结束---
--- 内部异常堆栈跟踪结束---
在 System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
在 System.Threading.Tasks.Task'1.GetResultCore(Boolean waitCompletionNotification)
在 System.Threading.Tasks.Task'1.get_Result()
在 RestSharpIPv6.Program.Main(String[] args) 在 C:\Users\chache\source\repos\RestsharpIPv6.NET\RestsharpIPv6.NET\Program.cs:line 14
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。