需求:有时后比如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端的更多相关文章

  1. WPF内嵌代码和后台代码简单混合使用

    下面实例展示了WPF内嵌代码和后台代码混合使用,一个简单基础的实例: xaml文件: <Window x:Class="WPF内嵌代码和后台代码混合使用.MainWindow" ...

  2. WPF内嵌WCF服务对外提供接口

    要测试本帖子代码请记得管理员权限运行vs. 我写这个帖子的初衷是在我做surface小车的时候有类似的需求,感觉这个功能还挺有意思的,所以就分享给大家,网上有很多关于wcf的文章 我就不一一列举了.公 ...

  3. LoRaWAN协议(三)--Server端数据协议

    LoRaWAN Server 端架构 LoRaWAN 的server包括 NS(Network server).AS(application server).CS(Custom server).... ...

  4. WPF内嵌网页的两种方式

    在wpf程序中,有时会内嵌网页.内嵌网页有两种方法,一种是使用wpf自带WebBrowser控件来调用IE内核,另一种是使用CefSharp包来调用chrom内核. 一.第一种使用自带WebBrows ...

  5. WPF内嵌CEF控件,与JS交互

    1)安装cefsharp.winform包 打开VS2017,打开nuget,找到cefsharp.winform,安装 问:为什么wpf程序不使用cefsharp.wpf? 答:因为cefwpf 4 ...

  6. Winform/WPF中内嵌BeetleX的HTTP服务

    在新版本的BeetleX.FastHttpApi加入了对netstandard2.0支持,如果程序基于.NetFramework4.6.1来构建WinForm或WPF桌面程序的情况下可以直接把Beet ...

  7. 使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等)

    使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等) 前言 移动端页面调试一直是好多朋友头疼的问题,iOS 由于其封闭的特性和整体较高的性能,整体适配相对好做,调试 ...

  8. WPF背景透明内嵌WebBrowser不显示问题,即AllowsTransparency = true 和 Webbrowser 等控件显示冲突

    首先感谢两位先导者: 1. 解决 WPF AllowsTransparency = true 和 Webbrowser 等控件显示冲突 原文地址:https://www.cnblogs.com/zhi ...

  9. WPF应用程序内嵌网页

    原文:WPF应用程序内嵌网页 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/shaynerain/article/details/78160984 WPF ...

  10. [Web Server]Tomcat调优之SpringBoot内嵌Tomcat源码分析

    以springboot:2.3.12.RELEASE中内嵌的tomcat-embed-core:9.0.46为例,进行分析 1 概述 1.0 关键依赖包 spring-boot-autoconfigu ...

随机推荐

  1. MMSC 扩充物料库存地点

    当涉及到物料的库存地点时,系统通常会做校验,该物料是否扩充了库存地点,没有扩充则报错.为了不使这样的错误干扰到程序逻辑,通常会在涉及时,先查询MARD表,判断是否存在对应的库存地点.如果没有存在,则直 ...

  2. javascript yield

    代码: function delay(time) { return new Promise(function (resolve, reject) { setTimeout(() => { res ...

  3. POJ:1511 Invitation Cards(双向搜索最短路径)

    POJ :1511 http://poj.org/problem?id=1511 思路 求1号点到其他点的最短路 + 其他点到1号点的最短. 结果用long long. 用快读可以加快时间 代码 sp ...

  4. AtCoder Beginner Contest 175 (AB水,C数学,D思维+前缀和处理+进价思考,E方阵+条件DP,F新回文字符串处理 GJ)

    补题链接:Here A - Rainy Season 如果不是 RSR 型的话直接计算 R 的数量即可 B - Making Triangle 给定 \(N\) 根长度分别为 \(L_i\) 的棍子, ...

  5. 动态给div赋值高,使页面高度100%

    import { ref, onMounted, onUnmounted, computed, nextTick } from 'vue' const boxRef = ref() const sea ...

  6. vue中form组件中上传el-upload(单、多附件上传,以及上传回显以及编辑不出现等问题)

    https://blog.csdn.net/weixin_46565787/article/details/121934075?spm=1001.2101.3001.6650.2&utm_me ...

  7. Linux-定时任务-cron

  8. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.11)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  9. IBM java的分析工具(ga和ha)学习和整理

    IBM java的分析工具(ga和ha)学习和整理 背景 前几天学习了整理了 jca 工具 今天继续学习一下 ga工具 ga 工具主要是分析gclog相关. 可以很直观的进行gclog的分析和展示. ...

  10. Oracle19c 多字符集支持的PDB

    Oracle19c 多字符集支持的PDB 背景 想在一个数据库里面支持多种字符集 突然发现Oracle12c开始已经可以实现一个CDB下面可以有多个不同字符集的PDB了 所以想着今天验证一下. 环境信 ...