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

从虚拟机调用本地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";
#elsethrow new PlatformNotSupportedException("Only Windows and Android currently supported.");
#endifpublic string DevServerRootUrl { get; }private Lazy<HttpClient> LazyHttpClient;public HttpClient HttpClient => LazyHttpClient.Value;public HttpMessageHandler? GetPlatformMessageHandler(){
#if WINDOWSreturn null;
#elif ANDROIDvar 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;#elsethrow new PlatformNotSupportedException("Only Windows and Android currently supported.");
#endif}#if ANDROIDinternal 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){returnJavax.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.mzph.cn/bicheng/53316.shtml

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

相关文章

常见的图纸加密软件方式:推荐10个最好用的图纸加密软件

在当今竞争激烈的商业环境中&#xff0c;保护设计图纸等敏感信息已成为企业不可忽视的任务。图纸加密软件作为一项重要的信息安全措施&#xff0c;不仅能够防止未经授权的访问&#xff0c;还能确保设计工作的机密性和完整性。面对市场上琳琅满目的加密软件&#xff0c;选择一款…

变压器结构

变压器结构提供磁路&#xff0c;通常称为“变压器铁芯”&#xff0c;旨在为磁场提供流动路径。该磁路对于两个输入和输出绕组之间感应电压必不可少。 然而&#xff0c;这种变压器结构&#xff08;两个绕组缠绕在不同的支路上&#xff09;效率不高&#xff0c;因为初级绕组和次…

Secret

Secret 在 Kubernetes 中&#xff0c;Secret 是一种用于存储敏感信息的资源&#xff0c;比如密码、OAuth 令牌、SSH 密钥等。Secret 允许你以安全的方式将这些信息传递给 Pod&#xff0c;而不是硬编码在镜像或配置文件中。 配置管理中心&#xff1a;configMap、Secret Secre…

数据库和MySQL

ER图 实体&#xff08;矩形&#xff09;&#xff1a;通常是现实世界的业务对象&#xff0c;当然使用一些逻辑对象也可以。 属性&#xff08;椭圆&#xff09;&#xff1a;实体拥有的属性。 联系&#xff08;菱形&#xff09;&#xff1a;实体与实体之间的关系。 函数依赖 函数依…

使用python+opencv解析图像和文本数据

1. 创建虚拟环境 新建文件夹, 并在文件夹中创建虚拟环境,可以使用Vscode打开文件夹, 然后在终端中输入以下命令: python -m venv venv2. 激活虚拟环境 在终端中输入以下命令: venv\Scripts\activate3. 安装依赖 在终端中输入以下命令: pip install opencv-pythonpip inst…

深度学习示例2-多输入多输出的神经网络模型

一、代码示例 from tensorflow import keras from tensorflow.keras import layers import numpy as np# 定义 多输入 多输出的模型 vocabulary_size = 1000 num_tags = 100 num_departments = 4title = keras.Input(shape=(vocabulary_size,), name = "title") tex…

kali——msfconsole的使用

目录 前言 msfconsole的使用基础 启动mfsconsole 各种辅助模块的使用 端口扫描模块&#xff08;portscan&#xff09; 查看端口扫描的模块 使用模块 查看所需设置 手动设置 执行 退出 各种漏洞模块的使用 nmap扫描主机漏洞 查看漏洞模块 使用漏洞模块 查看所需设…

Prometheus通过node_exporter监控Node节点,Node节点的详细指标解读

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)1.9-1.10

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第一周 卷积神经网络&#xff08;Foundations of Convolutional Neural Networks&#xff09;1.9 池化层&#xff08;Pooling layers&#xff09;1.10 卷 积 神 经 网 络 示 例 &#xff08; …

Linux_kernel汇编驱动06

一、ARM汇编语言&#xff08;GUN-gcc编译器下&#xff09; 1、语句格式 {symbol} {instruction|directive|pseudo-instruction} { comment} symbol&#xff1a;为符号。 在ARM汇编语言中&#xff0c;符号必须从一行的行头开始&#xff0c;并且符号中不能包含空格。 在指令和伪指…

基于C++实现(MFC界面)家谱管理系统

一、题目&#xff1a;家谱管理系统 二、内容&#xff1a; 2.1 概述 2.1.1 选题原因 做此题的原因是因为可以比较方便的记录家族历代成员的情况与关系&#xff0c;能很好的保存家族每一代的信息&#xff0c;而不用人工纸质的方式来存取家谱&#xff0c;更便于人们保存和使用…

爬虫练习(js逆向解密)

目标 网站地址交易列表 - 福建省公共资源交易电子公共服务平台 (fj.gov.cn) 抓取内容如下&#xff1a; 分析 查找js代码 点击下一页翻页的时候&#xff0c;查看请求返回的数据&#xff0c;发现data数据是经过加密后得到的 通过全局搜索data,发现有两千多个结果&#xff0c;一个…

AI超强语音转文本SenseVoice,本地化部署教程!

文章目录 模型介绍SenseVoice在线预览链接本地化部署VsCode 远程连接 模型介绍 SenseVoice专注于高精度多语言语音识别、情感辨识和音频事件检测 多语言识别&#xff1a; 采用超过40万小时数据训练&#xff0c;支持超过50种语言&#xff0c;识别效果上优于Whisper模型。富文本…

跨境电商代购系统中前台基本功能介绍:帮助更快的了解跨境代购业务

前台多语言&#xff1a;可支持语言有中文&#xff08;繁体&#xff09;中文&#xff08;简体&#xff09;英文等。多语言使用百度翻译引擎接口实现&#xff0c;翻译效果与百度一致&#xff1b;网站语言分为两大块&#xff1a;1.系统后台有语言包可以编辑修改网站标题以及发布文…

WPS中JS宏使用说明(持续优化...)

前言 好久没发文章了&#xff0c;今天闲来无事发篇文章找找之前的码字感觉。 正文 最近在写教案&#xff0c;发现之前的技术又可以派上用场了。就是JS&#xff0c;全称JavaScript&#xff0c;这个语言太强大了&#xff0c;我发现WPS里的宏现在默认就是JS。功能选项如下图&…

MySQL数据库安装(详细)—>Mariadb的安装(day21)

该网盘链接有效期为7天&#xff0c;有需要评论区扣我&#xff1a; 通过网盘分享的文件&#xff1a;mariadb-10.3.7-winx64.msi 链接: https://pan.baidu.com/s/1-r_w3NuP8amhIEedmTkWsQ?pwd2ua7 提取码: 2ua7 1 双击打开安装软件 本次安装的是mariaDB&#xff0c;双击打开mar…

Java运行环境的下载、安装、配置与运行

一、实验目的及要求 目的&#xff1a;掌握如何下载java JDK软件包&#xff0c;如何设置Java程序的运行环境&#xff0c;如何编写与运行Java程序&#xff0c;了解Java概貌。 要求&#xff1a; 1、安装Java JDK软件包&#xff1b; 2、练习编写简单的Java Application程序并掌握…

vscode安装使用plantuml插件

使用 VSCode 插件 如果你在 Visual Studio Code 中使用 PlantUML 插件&#xff0c;你可以按照以下步骤生成图片&#xff1a; 安装 PlantUML 插件&#xff1a; 在 VSCode 的扩展市场中搜索并安装 PlantUML 插件。 配置插件&#xff1a; 打开设置&#xff0c;确保插件配置正确。…

Node.js发票查验接口示例、识别查验接口参数返回

财务、审计等经常与发票打交道的人员常常会遇到虚假发票、错票、重复报销等一系列问题。对于会计审计、代理记账、电子商务等发票查验量多的企业来说&#xff0c;成千上万张发票如果仅依赖于人工来进行核验&#xff0c;速度慢效率低&#xff0c;准确率也没保障&#xff0c;因此…

MySQL record

更改密码&#xff1a; alter user rootlocalhost identified with mysql_native_password by ‘123456’; 注意&#xff1a; 在命令行方式下&#xff0c;每条MySQL的命令都是以分号结尾的&#xff0c;如果不加分号&#xff0c;MySQL会继续等待用户输入命令&#xff0c;直到MyS…