WPF内嵌Http协议的Server端
需求:有时后比如WPF,WinForm,Windows服务这些程序可能需要对外提供接口用于第三方服务主动通信,调用推送一些服务或者数据。
想到的部分实现方式:
一、使用Socket/WebSocket通信
二、使用消息队列(比如rabbitmq)
三、使用RPC框架(比如gRPC)
四、使用http协议的方式
五、当然也可以使用数据库或者本地文件等形式实现不过这种太不好了
本文就是采用第四种对外提供接口,代码很简单就是使用.net里的System.Net命名空间下的HttpListener就可以实现Http协议的Server端
下面是服务端一个实现代码

1 using Newtonsoft.Json;
2 using System;
3 using System.Collections.Generic;
4 using System.IO;
5 using System.Linq;
6 using System.Net;
7 using System.Text;
8 using System.Threading.Tasks;
9
10 namespace WpfHttpServer
11 {
12 public class HttpServerService
13 {
14 private static bool isExcute = true;
15 private static HttpListener listener = new HttpListener();
16 public static void Start()
17 {
18 System.Threading.ThreadPool.QueueUserWorkItem(w => Excute());//单独开启一个线程执行监听消息
19 }
20
21 private static void Excute()
22 {
23 if (HttpListener.IsSupported)
24 {
25 if (!listener.IsListening)
26 {
27 listener.Prefixes.Add("http://127.0.0.1:8888/"); //添加需要监听的url
28 listener.Start(); //开始监听端口,接收客户端请求
29 }
30 while (isExcute)
31 {
32 try
33 {
34 //阻塞主函数至接收到一个客户端请求为止 等待请求
35 HttpListenerContext context = listener.GetContext();
36 //解析请求
37 HttpListenerRequest request = context.Request;
38 //构造响应
39 HttpListenerResponse response = context.Response;
40 //http请求方式:get,post等等
41 string httpMethod = request.HttpMethod?.ToLower();
42 string rawUrl = request.RawUrl;//不包括IP和端口
43 var Url = request.Url;//全路径
44
45 if (httpMethod == "get")
46 {
47 //获取查询参数
48 var queryString = request.QueryString;
49 // 请求接口 test/method?id=5
50 //键值对方式 string val = queryString["key"];
51 //string val = queryString["id"];val的值是5
52 }
53 else if (httpMethod == "post")
54 {
55 //请求接口 test/postMethod 格式是json
56 //{
57 // "id":5,
58 // "name":"zs"
59 //}
60 //获取pots请求的请求体,json格式的字符串
61 var reader = new StreamReader(request.InputStream);
62 var questBody = reader.ReadToEnd();
63 if (!string.IsNullOrEmpty(rawUrl))
64 {
65 //这里可以直接用switch这个只是demo
66 if (rawUrl.Equals("/server/uploadgenconnected", StringComparison.OrdinalIgnoreCase))
67 {
68 if (!string.IsNullOrEmpty(questBody))
69 {
70 UploadGenConnectedModel model = JsonConvert.DeserializeObject<UploadGenConnectedModel>(questBody);
71 if (model != null)
72 {
73 // To Do
74 }
75 }
76
77 }
78 }
79 }
80
81 var responseString = string.Empty;
82
83 // 执行其他业务逻辑
84 //*****************
85
86 responseString = JsonConvert.SerializeObject(new { code = 1, msg = "发送成功" });
87 byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
88 //对客户端输出相应信息.
89 response.ContentLength64 = buffer.Length;
90 //response.StatusCode = 200;
91 //response.ContentType = "text/plain";
92 //发送响应
93 using (System.IO.Stream output = response.OutputStream)
94 {
95 output.Write(buffer, 0, buffer.Length);
96 }
97 }
98 catch (Exception exceotion)
99 {
100 //Logger.Error("处理消息异常", exceotion);
101 string str = exceotion.Message;
102 }
103 }
104 }
105 else
106 {
107 //Logger.Info("系统不支持HttpListener");
108 }
109 }
110
111 public static void Stop()
112 {
113 isExcute = false;
114 if (listener.IsListening)
115 listener.Stop();
116 }
117
118 }
119
120 public class UploadGenConnectedModel
121 {
122 public bool GenConnected { get; set; }
123 }
124
125 }
服务启动时需要启动监听,服务停止时需要停止监听

1 /// <summary>
2 /// App.xaml 的交互逻辑
3 /// </summary>
4 public partial class App : Application
5 {
6 public App()
7 {
8 HttpServerService.Start();
9 }
10 }
文章主要参考:https://www.cnblogs.com/pudefu/p/9512326.html
粗略参考
https://www.cnblogs.com/uu102/archive/2013/02/16/2913410.html
https://www.cnblogs.com/tuyile006/p/11857590.html
https://www.cnblogs.com/GreenShade/p/10915023.html
https://blog.csdn.net/crystalcs2010/article/details/107937472
WPF内嵌Http协议的Server端的更多相关文章
- WPF内嵌代码和后台代码简单混合使用
下面实例展示了WPF内嵌代码和后台代码混合使用,一个简单基础的实例: xaml文件: <Window x:Class="WPF内嵌代码和后台代码混合使用.MainWindow" ...
- WPF内嵌WCF服务对外提供接口
要测试本帖子代码请记得管理员权限运行vs. 我写这个帖子的初衷是在我做surface小车的时候有类似的需求,感觉这个功能还挺有意思的,所以就分享给大家,网上有很多关于wcf的文章 我就不一一列举了.公 ...
- LoRaWAN协议(三)--Server端数据协议
LoRaWAN Server 端架构 LoRaWAN 的server包括 NS(Network server).AS(application server).CS(Custom server).... ...
- WPF内嵌网页的两种方式
在wpf程序中,有时会内嵌网页.内嵌网页有两种方法,一种是使用wpf自带WebBrowser控件来调用IE内核,另一种是使用CefSharp包来调用chrom内核. 一.第一种使用自带WebBrows ...
- WPF内嵌CEF控件,与JS交互
1)安装cefsharp.winform包 打开VS2017,打开nuget,找到cefsharp.winform,安装 问:为什么wpf程序不使用cefsharp.wpf? 答:因为cefwpf 4 ...
- Winform/WPF中内嵌BeetleX的HTTP服务
在新版本的BeetleX.FastHttpApi加入了对netstandard2.0支持,如果程序基于.NetFramework4.6.1来构建WinForm或WPF桌面程序的情况下可以直接把Beet ...
- 使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等)
使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等) 前言 移动端页面调试一直是好多朋友头疼的问题,iOS 由于其封闭的特性和整体较高的性能,整体适配相对好做,调试 ...
- WPF背景透明内嵌WebBrowser不显示问题,即AllowsTransparency = true 和 Webbrowser 等控件显示冲突
首先感谢两位先导者: 1. 解决 WPF AllowsTransparency = true 和 Webbrowser 等控件显示冲突 原文地址:https://www.cnblogs.com/zhi ...
- WPF应用程序内嵌网页
原文:WPF应用程序内嵌网页 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/shaynerain/article/details/78160984 WPF ...
- [Web Server]Tomcat调优之SpringBoot内嵌Tomcat源码分析
以springboot:2.3.12.RELEASE中内嵌的tomcat-embed-core:9.0.46为例,进行分析 1 概述 1.0 关键依赖包 spring-boot-autoconfigu ...
随机推荐
- Solon Aop 特色开发(2)注入或手动获取Bean
Solon,更小.更快.更自由!本系列专门介绍Solon Aop方面的特色: <Solon Aop 特色开发(1)注入或手动获取配置> <Solon Aop 特色开发(2)注入或手动 ...
- 阿里云Imagine Computing创新技术大赛正式开启!
阿里云 Imagine Computing 创新技术大赛,是由阿里云与英特尔主办,阿里云天池平台.边缘云.视频云共同承办的顶级赛事,面向个人开发者和企业的边缘云领域算法及实时音视频应用类挑战. 本次创 ...
- springboot 实现接收前端发来的图片和视频以及在页面上展示图片和视频
springboot 实现接收前端发来的图片和视频以及在页面上展示图片和视频 一.效果: 1.上传图片 2.显示上传的图片 3.上传的视频 4.显示上传的视频 二.代码 没依赖特殊的包,引入sprin ...
- FrameWork使用TraeFik连接Grpc的坑
背景介绍:因为公司最近使用TraeFik来代替nginx做代理服务器.导致一些老项目访问Grpc的时候直接Status(StatusCode=Unavailable, Detail="fai ...
- 在Chrome中安装扩展程序
场景:在Chrome中安装NetBeans Connector插件,将下载好的crx文件拖到扩展程序页面时,发现该插件并没有安装成功. 分析:浏览器默认禁用了拖入安装 .crx 扩展的功能,导致crx ...
- spring--JDK动态代理和CGLIB代理的区别
JDK 动态代理和 CGLIB 代理是 Java 中常用的两种动态代理实现方式,它们各有特点和适用场景: JDK 动态代理: JDK 动态代理是基于接口的代理方式,它使用 Java 反射机制来创建代理 ...
- Manjaro Linux永久修改主机名
技术背景 Linux系统中默认的主机名可以通过hostname指令进行查询,一般默认的是一串的随机字符串: [dechin@dechin-20n2s01200 numba]$ hostname dec ...
- SD Host控制器的系统集成
控制器集成需求 SD Host可以从外部读取数据存储到SRAM和eFlash或者可以从内部读取数据输出到外部存储 AHB Bus slave接口用于配置 master接口作为主设备,DMA可以控制总线 ...
- sql server 数据恢复
1) 备份当前数据库的事务日志:BACKUP LOG [数据库名] TO disk= N'备份文件名' WITH NORECOVERY 2) 恢复一个误删除之前的完全备份:RESTORE DATABA ...
- ASR6505是基于STM 8位MCU的无线通信芯片组
ASR6505是基于STM 8位MCU的无线通信芯片组 ASR6505是一种通用的LoRa无线通信芯片组,集成了LoRa无线电收发器.LoRa调制解调器和一个8位CISC MCU ASR6505是基于 ...