C# 实现基于exe内嵌HTTPS监听服务、从HTTP升级到HTTPS 后端windows服务

news2024/9/23 7:26:33

        由于客户需要把原有HTTP后端服务升级为支持https的服务,因为原有的HTTP服务是一个基于WINDOWS服务内嵌HTTP监听服务实现的,并不支持https, 也不像其他IIS中部署的WebAPI服务那样直接加载HTTPS证书,所以这里需要修改原服务支持https和服务器环境上进行HTTPS端口绑定设置,具体如下:

(注:以下操作需要你已经具备了HTTPS证书。)

1、安装证书,双击pfx文件,安装到:“本地计算机”–>“个人”;

2、双击打开crt证书,详细信息中可以看到(certhash)指纹 相关信息;

3、执行端口绑定(默认443端口)

netsh http add sslcert ipport=0.0.0.0:8080 certhash=指纹 appid={程序GUID/newguid} clientcertnegotiation=enable

4、服务端程序实现:

using System;
public class HttpService
{
    public MyHttpServer()
    {
        System.Net.HttpListener httpListener = new System.Net.HttpListener();
        httpListener.AuthenticationSchemes =  System.Net.AuthenticationSchemes.Anonymous;
        httpListener.Prefixes.Add("https://*:8000/"); // 支持https
        httpListener.Start();
        new System.Threading.Thread(new System.Threading.ThreadStart(delegate
        {
            while (true)
            {
                try
                {
                    System.Net.HttpListenerContext httpListenerContext =  httpListener.GetContext();
                    new System.Threading.Thread(new  System.Threading.ParameterizedThreadStart((input) =>
                    {
                        System.Net.HttpListenerContext ctx =  (System.Net.HttpListenerContext)input;
                        System.Net.HttpListenerRequest request = ctx.Request;
                        string pram = request.QueryString["Data"];//Get入参
                        string responseMessage = string.Empty;//返回值
                        if (!string.IsNullOrEmpty(pram))
                        {
                            //Get入参
                            pramOrg = pram;
                            pram = System.Web.HttpUtility.UrlDecode(pram);
                        }
                        //POST入参
                        if (request.HttpMethod == "POST")
                        {
                            //处理业务请求
                            StreamReader reader = new  StreamReader(request.InputStream, Encoding.UTF8);
                            pram = reader.ReadToEnd();
                            reader.Close();
                            reader.Dispose();
                        }
                        #region 业务处理
                        try
                        {
                            //业务处理
                            responseMessage = "业务结果";
                        }
                        catch (Exception ex)
                        {
                            //异常处理
                            responseMessage = ex.Message;
                        }
                        #endregion 业务处理
                        #region 返回给调用者
                        //输出类型
                        httpListenerContext.Response.ContentType = "text/html;  charset=UTF-8";
                        //返回状态
                        httpListenerContext.Response.StatusCode = 200;
                        //设置授权,尝试解决Jquery跨域问题
                         //httpListenerContext.Response.Headers["Access-Control-Allow-Origin"] = "*";
                         //httpListenerContext.Response.Headers["Access-Control-Allow-Methods"] =  "GET,POST";
                         //httpListenerContext.Response.Headers["Access-Control-Max-Age"] = "1000";
                        try
                        {
                            //输出界面内容
                            if (!string.IsNullOrEmpty(responseMessage))
                            {
                                //返回文本内容
                                using (StreamWriter writer = new  StreamWriter(httpListenerContext.Response.OutputStream))
                                {
                                    writer.Write(responseMessage);
                                }
                            }
                        }
                        catch
                        {
                            //刷新太快异常,不做处理
                        }
                        #endregion 返回给调用者
                    })).Start(httpListenerContext);
                }
                catch
                { }
            }
        })).Start();
    }
}

如上面执行端口绑定过程中报错,或添加失败,可以参考下面的处理:

1、检查netsh 命令的参数是否正确;

2、SSL 证书添加失败, 错误: 1312 指定的登录会话不存在。它可能已经被终止。的处理方法:

     键盘 WIN+R 输入mmc.exe,如下:

    

  点‘确定“,弹出如下控制台根节点界面,

选择 文件->添加/删除管理单元,或直接快捷键ctrl+m 弹出如下,并进行操作:

然后再到个人导入证书

最后将SSL证书绑定至端口号

netsh http add sslcert ipport=0.0.0.0:8080 certhash=指纹 appid={程序GUID/newguid} clientcertnegotiation=enable

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

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

相关文章

Java基础-Java中的常用类(上)

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 String类 创建字符串 字符串长度 连接字符串 创建格式化字符串 String 方法 System类 常用方法 方…

谨慎投稿!这本EI期刊正在被“劫持”!

Journsl ofTisniin lniversity Seience and Technology《天津大学学报(自然科学与工程技术版)》创刊于l955年,月刊,全国核心期刊,天津市一级期刊。该刊是由天津大学主办的综合性学术刊物,主要刊登自然科学和…

【第三版 系统集成项目管理工程师】第4章 信息系统架构

持续更新。。。。。。。。。。。。。。。 【第三版】系统集成项目管理工程师 考情分析4.1架构基础4.1.1指导思想(非重点) P1364.1.2设计原则(非重点) P1364.1.3建设目标(非重点) P1374.1.4总体框架 P138练习…

SaaS产品和独立部署型产品有什么区别,该怎么选择?

随着云计算和软件服务的多样化,产品形式主要划分SaaS型(开通即用)和独立部署(完整交付)两种模式,那么SaaS产品和独立部署产品有哪些区别,我们在选择产品的时候应该如何去抉择?本文我…

Java的Thread类中的常用方法解析

Java可以通过Thread类实现多线程,下面来介绍几个Thread类中常用的方法 void start() 开启线程,jvm自动调用run方法 void run() 设置线程任务,这个run方法是Thread重写的接口Runnable中的run方法 String getName() 获取线程名字 void s…

linux 安装Openjdk1.8

一、在线安装 1、更新软件包 sudo apt-get update 2、安装openjdk sudo apt-get install openjdk-8-jdk 3、配置openjdk1.8 openjdk默认会安装在/usr/lib/jvm/java-8-openjdk-amd64 vim ~/.bashrc export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export JRE_HOME${J…

【Linux】文件和目录管理命令——ls,cp,rm,mv

1.文件与目录的查看:Is ls [-aAdfFhilnrRst] 文件名或目录名称ls [ --color{never,auto,always} ]文件名或目录名称ls [ --full-time ]文件名或目录名称 选项与参数: -a:全部的文件,连同隐藏文件&am…

电子产品分销商 DigiKey 在新视频系列中探索智能城市中的AI

电子产品分销商DigiKey推出了一系列新视频,深入探讨了AI在智能城市中的集成应用。这个名为“智能世界中的AI”的系列是其“城市数字”视频系列的第四季,它审视了城市环境中从基础设施到公共服务的多种AI硬件和软件的部署情况。 该系列由电子制造商莫仕&…

Java的垃圾回收机制解说

Java 内存运行时区域中的程序计数器、虚拟机栈、本地方法栈随线程而生灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由 JIT 编译器进行一些优化&…

苹果电脑视频压缩工具,苹果电脑视频压缩软件

随着数字媒体内容的爆炸性增长,视频文件的体积越来越大,如何在保证画质的前提下,有效地压缩视频文件,成为许多创作者和普通用户的一大需求。本文将为您详细介绍视频压缩界的佼佼者,让您轻松应对视频文件体积过大的难题…

vue3中使用 tilwindcss报错 Unknown at rule @tailwindcss

解决方法: vscode中安装插件 Tailwind CSS IntelliSense 在项目中的 .vscode中 settings.json添加 "files.associations": {"*.css": "tailwindcss"}

网络连接线相关问题

问题1; 直通线为什么两头都是T568B?是否可以两台T5568A?或者任意线序,只需两头一致? 不行,施工规范规定。(原因;网线最长距离100m,实际用起来要把网线包管,走…

Mapboxgl 根据 AWS 地形的高程值制作等高线

更多精彩内容尽在dt.sim3d.cn&#xff0c;关注公众号【sky的数孪技术】&#xff0c;技术交流、源码下载请添加VX&#xff1a;digital_twin123 使用mapboxgl 3.0版本&#xff0c;根据 AWS 地形图块的高程值制作等高线&#xff0c;源码如下&#xff1a; <!DOCTYPE html> &…

CSS content 计数器

CSS content 计数器 CSS 计数器通过一个变量来设置&#xff0c;根据规则递增变量。 使用计数器自动编号 CSS 计数器根据规则来递增变量。 CSS 计数器使用到以下几个属性&#xff1a; counter-reset - 创建或者重置计数器&#xff0c;给计算器命名。注意声明计算器不能在自身…

乡村振兴指数与其30个原始变量数据(Shp/Dta/Excel格式,2000-2022年)

数据简介&#xff1a;这份数据是我国各地级市乡村振兴指数与其30各原始变量数据并对其进行地图可视化表达。城镇化是当今中国社会经济发展的必由之路。当前我国城镇化处于发展的关键时期&#xff0c;但城镇化发展的加快却是一把双刃剑&#xff0c;为何要如此形容呢?因为当前城…

【产品经理】订单处理12-订单的取消与反取消

在电商ERP系统中&#xff0c;订单取消与反取消也是常见功能之一。 订单取消与反取消也是电商ERP系统的常见功能&#xff0c;本次主要讲解下订单取消与反取消的逻辑。 一、订单取消 在电商ERP系统中&#xff0c;订单取消一般由审单员操作&#xff0c;此类取消一般是由于上下游…

ICMP隧道

后台私信找我获取工具 目录 ICMP隧道作用 ICMP隧道转发TCP上线MSF 开启服务端 生成后门木马 msf开启监听 开启客户端icmp隧道 执行后门木马&#xff0c;本地上线 ICMP隧道转发SOCKS上线MSF 开启服务端 生成后门木马 msf开启监听 开启客户端icmp隧道 ​执行后…

gui创新点charts图表

import javax.swing.*; import java.awt.*;public class ComboChartExample extends JPanel {Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);// 数据int[] values {100, 200, 150, 300, 250};int[] lineValues {120, 180, 160, 280, 230};Str…

Pytorch实战(二):VGG神经网络

文章目录 一、诞生背景二、VGG网络结构2.1VGG块2.2网络运行流程2.3总结 三、实战3.1搭建模型3.2模型训练3.3训练结果可视化3.4模型参数初始化 一、诞生背景 从网络结构中可看出&#xff0c;所有版本VGG均全部使用33大小、步长为1的小卷积核&#xff0c;33卷积核同时也是最小的能…

Jenkins 常用的 Linux 指令

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…