最近做了个项目,需要请求服务商的接口拿回数据,同步到项目的库上边,本来这是非常简单的开发.
项目框架.net5
一调用服务商接口,竟然出现如下错误:
根据多年经验,这个提示,就是连请求都没发送到对方服务器上边。经过几天的探索,我发现并非代码问题。
试过多种请求方式都是同样的错误,偶然间我发现用.net3.1框架竟然是可以成功拿回数据的。
就是用.net 5开发就会有问题,根据多年的开发经验,个人感觉就是.net5框架的底层请求逻辑改生了改变,导致无法请求成功。
最后在github 找到了解决方案如下
就是建立请求类的时候,需要用ip4的sockets.
private HttpClient CreateWorkaroundClient()
{
SocketsHttpHandler handler = new SocketsHttpHandler
{
ConnectCallback = IPv4ConnectAsync
};
return new HttpClient(handler);
static async ValueTask<Stream> IPv4ConnectAsync(SocketsHttpConnectionContext context, CancellationToken cancellationToken)
{
// By default, we create dual-mode sockets:
// Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.NoDelay = true;
try
{
await socket.ConnectAsync(context.DnsEndPoint, cancellationToken).ConfigureAwait(false);
return new NetworkStream(socket, ownsSocket: true);
}
catch
{
socket.Dispose();
throw;
}
}
}
用上这个类来请求就可以正常拿回数据了。
我来解释一下为什么吧。
因为 .net5的请求类底层sockets 都是用 ipv6来连接,而我访问接口需要用连服务商的VPN,但这个VPN只支持IPV4,所以socket建立就无法成功,也就是看到我们开头那个报错,无法建立正常连接.
至此,代码的请求解决了,说真的搞到心都累了。
附上请求代码,大家可以参考一下,希望帮助到大家
var client = CreateWorkaroundClient();
client.DefaultRequestHeaders.ExpectContinue = false;
var request = new HttpRequestMessage(HttpMethod.Post, "请求地址,我这里请求的是webservices");
var collection = new List<KeyValuePair<string, string>>();
collection.Add(new("aa", "aa"));
collection.Add(new("bb", "bb"));
collection.Add(new("cc", "cc"));
collection.Add(new("dd", "dd"));
var content = new FormUrlEncodedContent(collection);
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
//Console.WriteLine(await response.Content.ReadAsStringAsync());
string result = await response.Content.ReadAsStringAsync();
所以做项目只不过是在不断的尝试跟排查问题,遇到问题大家不要慌,仔细分析代码,肯定可以解决问题的。上边的问题,也是困扰了好几天,摆正好心态,调整好状态,总是可以解决问题的。
以上是自己的做为资深开发的一些个人经历,把这些经验分享给大家,希望以后大家在从事开发中,可以避免不必要的麻烦,跟浪费时间精力。
要是大家喜欢我的文章的话,可以在文章下留言或是联系我,共同进步,共同探讨开发的一些案例,促进彼此间的交流,分享一些日常的开发趣事。
共有 0 条评论