解决 Android 上的 .NET MAUI/Xamarin.AndroidX 应用调用 ASP.NET Core API 端点时 SSL 连接被拒绝的问题

news2024/9/20 16:52:34

从虚拟机调用本地API报各种 SSL 连接不上的错误,这给本地调试造成了极大的不便,在被这个问题困扰了多日以后,终于在GitHub上找到答案

基于这个 帖子 ,有一个回复

他写了一个帮助类,专门用来调试本地的API,并给出了这个调用类的用法,此帮助类如下

using System.Net.Security;

public class DevHttpsConnectionHelper
{
    public DevHttpsConnectionHelper(int sslPort)
    {
        SslPort = sslPort;
        DevServerRootUrl = FormattableString.Invariant($"https://{DevServerName}:{SslPort}");
        LazyHttpClient = new Lazy<HttpClient>(() => new HttpClient(GetPlatformMessageHandler()));
    }

    public int SslPort { get; }

    public string DevServerName =>
#if WINDOWS
        "localhost";
#elif ANDROID
        "10.0.2.2";
#else
        throw new PlatformNotSupportedException("Only Windows and Android currently supported.");
#endif

    public string DevServerRootUrl { get; }

    private Lazy<HttpClient> LazyHttpClient;
    public HttpClient HttpClient => LazyHttpClient.Value;

    public HttpMessageHandler? GetPlatformMessageHandler()
    {
#if WINDOWS
        return null;
#elif ANDROID
        var handler = new CustomAndroidMessageHandler();
        handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
        {
            if (cert != null && cert.Issuer.Equals("CN=localhost"))
                return true;
            return errors == SslPolicyErrors.None;
        };
        return handler;

#else
        throw new PlatformNotSupportedException("Only Windows and Android currently supported.");
#endif
    }

#if ANDROID
    internal sealed class CustomAndroidMessageHandler : Xamarin.Android.Net.AndroidMessageHandler
    {
        protected override Javax.Net.Ssl.IHostnameVerifier GetSSLHostnameVerifier(Javax.Net.Ssl.HttpsURLConnection connection)
            => new CustomHostnameVerifier();

        private sealed class CustomHostnameVerifier : Java.Lang.Object, Javax.Net.Ssl.IHostnameVerifier
        {
            public bool Verify(string? hostname, Javax.Net.Ssl.ISSLSession? session)
            {
                return
                    Javax.Net.Ssl.HttpsURLConnection.DefaultHostnameVerifier.Verify(hostname, session)
                    || hostname == "10.0.2.2" && session.PeerPrincipal?.Name == "CN=localhost";
            }
        }
    }
#endif
}

 在安卓机里面是没有 localhost 的,也没有 127.0.0.1 代表本机的取而代之的是 10.0.2.2 。在 HTTPS 里面,证书是被强制使用的,本地 Web API 会有一个默认证书,他里面带一个 “CN=localhost” 所以上面的类针对这个进行了过滤,并且 Android 的底层用的不是默认的 .net 的 HttpClient ,使用了 GetPlatformMessageHandler 进行了重写,这个可是Java 的包。

我的本地调用使用

                            var devSslHelper = new DevHttpsConnectionHelper(sslPort: 5001);

                            _blazorHubConnection = new HubConnectionBuilder()
#if ANDROID
                                .WithUrl(devSslHelper.DevServerRootUrl + "/hubs/devicehub"
                                    , configureHttpConnection: o =>
                                    {
                                        o.HttpMessageHandlerFactory = m => devSslHelper.GetPlatformMessageHandler();
                                    }
                                )
#else
            .WithUrl(devSslHelper.DevServerRootUrl + "/hubs/devicehub")
#endif
                                .Build();

这个时候就不报 SSL 的连接错误了,可以方便的正常调试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

002:显示DICOM图像(替换掉 vtkImageViewer2 )

VTK 医学图像处理---DICOM图像显示 对第一个DICOM显示例子的展开&#xff08;替换掉vtkImageViewer2类&#xff09; 两个例子实现的效果对比&#xff0c;其中右侧是对第一个例子展开后的显示效果&#xff0c;展示了一个完整的VTK渲染管线的过程。 目录 VTK 医学图像处理---DIC…

项目文章|PNAS:中国农大田见晖教授团队揭示DNA甲基化保护早期胚胎线粒体基因组稳定性

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 在早期哺乳动物胚胎中&#xff0c;线粒体氧化代谢增强是着床后生存和发育的重要特征&#xff1b;着床前期的线粒体重塑是正常胚胎发生的关键事件。在这些变化中&#xff0c;氧化磷酸化&a…

Java学习中如何分辨 = 和 == 及其使用方法

在学习Java编程语言时&#xff0c; 和 是两个非常基础的运算符&#xff0c;虽然它们看起来相似&#xff0c;但在语义和应用场景上却有明显的区别。理解并正确使用这两个符号对于编写正确且高效的Java代码至关重要。 1. 运算符&#xff1a;赋值运算符 在Java中是赋值运算符&a…

”wait”和“notify”为什么要在Synchronized代码块里面?

wait和notify用来实现多线程之间的协调&#xff0c;wait表示让线程进入到阻塞状态&#xff0c;notify表示让阻塞的线程唤醒。 wait和notify必然是成对出现的&#xff0c;如果一个线程被wait()方法阻塞&#xff0c;那么必然需要另外一个线程通过notify()方法来唤醒这个被阻塞的…

作为技术Leader如何带散一个团队

theme: channing-cyan 大家好&#xff0c;我是程序员凌览。 这个话题本身就很有趣——如何有效地带散一个团队&#xff0c;精选了两位网友的回答让我们一起来看看。 第一位网友的回答 1938年10月14日&#xff0c;毛泽东谈了如何把团队带好。你反着来&#xff0c;肯定能把团…

【计算机组成原理】 计算机发展历程

文章目录 计算机发展历程计算机系统的概念计算机硬件计算机软件 计算机硬件的发展计算机的四代变化计算机元件的更新换代 计算机软件的发展计算机的发展趋势 计算机发展历程 计算机系统的概念 计算机系统 计算机硬件 计算机软件 计算机硬件 计算机的实体&#xff0c;如主…

16、java 面向对象之三:方法参数的值传递机制(参数为基本数据类型、参数为引用数据类型的案例剖析及内存解析)

java 面向对象之三&#xff1a; Ⅰ、方法的参数传递&#xff1a;参数为基本数据类型1、基本数据类型的值传递&#xff1a;其一、代码为&#xff1a;其二、内存解析为&#xff1a;其三、截图为&#xff1a; Ⅱ、方法的参数传递&#xff1a;参数为引用数据类型1、引用数据类型的值…

docker镜像多阶段构建

Docker 多阶段构建是为了创建轻量化和更高效的 Docker 镜像而产生的一种技术。通过使用多阶段构建&#xff0c;可以将不同阶段的构建需求分离开来&#xff0c;最终结果只包含实际部署所需要的部分&#xff0c;从而缩小镜像的大小。 以下是使用多阶段构建的基本步骤&#xff1a…

SpringBoot项目初始化搭建

SpringBoot项目搭建 创建SpringBoot项目事务编程式事务声明式事务 PageHelper主要特点&#xff1a;依赖使用常用方法 跨域问题JSONP&#xff08;JSON with Padding&#xff09;工作原理&#xff1a;代码示例 CORS&#xff08;Cross-Origin Resource Sharing&#xff09;工作原理…

江协科技STM32学习- P11 中断系统,EXTI外部中断

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

网络ACL详解-从原理到实战模拟

引言 在复杂多变的网络环境中&#xff0c;保障网络安全和数据传输的合法性、高效性至关重要。访问控制列表&#xff08;Access Control Lists&#xff0c;简称ACL&#xff09;作为网络安全的重要组成部分&#xff0c;广泛应用于各种网络设备中&#xff0c;用以控制网络流量的流…

传输大咖39 | 半导体行业的FTP替代升级方案

在半导体行业&#xff0c;数据的快速、安全、稳定传输是研发和生产的关键。传统的FTP&#xff08;文件传输协议&#xff09;虽然在早期被广泛使用&#xff0c;但随着行业的发展&#xff0c;其局限性逐渐显现。本文将探讨传统FTP在半导体行业的不足&#xff0c;并介绍镭速提供的…

【JAVA入门】Day31 - 双列集合 —— Map 系列

【JAVA入门】Day31 - 双列集合 —— Map 系列 文章目录 【JAVA入门】Day31 - 双列集合 —— Map 系列一、双列集合体系结构二、Map 的遍历方式2.1 键找值2.2 键值对遍历2.3 Lambda 表达式遍历键值对 三、HashMap3.1 HashMap的创建 四、LinkedHashMap五、TreeMap 单列集合每次添…

Excel使用VLOOKUP公式匹配不出正确公式,返回#N/A

问题&#xff1a; Excel使用VLOOKUP公式匹配不出正确公式&#xff0c;返回#N/A 原因&#xff1a; 原数据和匹配的数据格式不一致 解决办法&#xff1a; 把格式都设置为文本。 例如添加一列&#xff0c;输入英文符号&#xff0c;然后把数据源拼接起来&#xff0c;转换为文…

3招解决苹果手机qq图片恢复问题,快速恢复原图

Q&#xff1a;我手机QQ上的图片打不开了&#xff0c;怎么办呢&#xff1f;你有什么方法可以帮我解决这个问题吗&#xff1f; A&#xff1a;当然有啦&#xff0c;小编在数据恢复这个方面可是很厉害的。今天&#xff0c;小编就告诉你3个超绝的QQ图片恢复的小妙计&#xff0c;可以…

九盾叉车U型区域警示灯,高效照明和安全警示

叉车运作的环境比较复杂&#xff0c;在方便人们物流运输的同时也存在着很大的安全隐患&#xff0c;特别是叉车碰撞人的事故发生率很高&#xff0c;那我们该怎么在减少成本的同时又能避免碰撞事故的发生呢&#xff1f; 九盾叉车U型区域警示灯&#xff0c;仅需一盏灯安装在叉车尾…

有人送出几百克黄金,有人搭上百万!现在快递也不敢收了?

还记得一年多前小柴遇到过个这样的事&#xff0c;有一天早上&#xff0c;小柴还没睡醒&#xff0c;就被一京东小哥的敲门声吵醒了&#xff01; 小柴当时揉着眼睛&#xff0c;稀里糊涂的签收了这小哥送来的两个快递&#xff0c;没成想&#xff0c;不到一分钟的时间&#xff0c;…

基于多模态大语言模型的摄像头实时感知交互

简介&#xff1a; 调用本地摄像头&#xff0c;通过多模态大语言模型实时感知世界&#xff0c;并进行交互 界面&#xff1a; 代码&#xff1a; import tkinter as tk from tkinter import ttk from PIL import Image, ImageTk import cv2 import requests# 定义处理函数 def…

从源码到应用:数字药店系统与医保购药APP的开发实践

本篇文章&#xff0c;我们将深入探讨数字药店系统的开发过程&#xff0c;并介绍医保购药APP如何通过源码设计实现从基础功能到完整应用的转化。 一、数字药店系统概述 数字药店系统是一种基于互联网技术开发的在线药品销售与管理平台&#xff0c;通常包括药品展示、在线购买、…

NAT技术介绍+缺陷(内网穿透+工具),NAPT(介绍,替换过程,原理,NAT转换表)

目录 NAT技术 介绍 NAT转换表 引入 介绍 NAPT技术介绍 NAPT替换过程 NAPT原理 注意点 NAT缺陷 无法直接访问其他内网主机 内网穿透 工具 其他 NAT技术 介绍 NAT 是一种网络技术&#xff0c;它允许在一个公共 IP 地址和多个私有 IP 地址(入口路由器的wan口地址 …