WinForms 的支持跨域的测试程序

news2024/11/15 9:28:11

WinForms 的支持跨域的测试程序

在这里插入图片描述

using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;

namespace SimpleHttpServer_cors
{
   public partial class Form1 : Form
   {
       private HttpListener listener;
       private Thread listenerThread;
       private bool isStopping = false; // 标志位,用于指示服务是否正在停止


       public Form1()
       {
           InitializeComponent();
           this.FormClosing += Form1_FormClosing; // 订阅窗体关闭事件
           txtIPAddress.Text = GetLocalIP();
       }

       private void btnStartService_Click(object sender, EventArgs e)
       {
           string ipAddress = txtIPAddress.Text;
           string port = txtPort.Text;

           listener = new HttpListener();
           listener.Prefixes.Add($"http://{ipAddress}:{port}/");

           listenerThread = new Thread(StartListener);
           listenerThread.Start();

           MessageBox.Show("服务已启动");
       }

       private void StartListener()
       {
           listener.Start();
           while (listener.IsListening)
           {
               try
               {
                   var context = listener.GetContext();
                   ThreadPool.QueueUserWorkItem(o => HandleRequest(context));
               }
               catch (HttpListenerException)
               {
                   // 监听器已停止
                   break;
               }
           }
       }

       private void HandleRequest(HttpListenerContext context)
       {
           string responseString = string.Empty;

           if (context.Request.HttpMethod == "GET" && context.Request.Url.AbsolutePath == "/getapi/getadate/test2")
           {
               responseString = "{\"sites\":[{\"name\":\"菜鸟教程\",\"get_url\":\"www.runoob.com\"},{\"name\":\"google\",\"get_url\":\"www.google.com\"},{\"name\":\"微博\",\"get_url\":\"www.weibo.com\"}]}";
           }
           else if (context.Request.HttpMethod == "POST" && context.Request.Url.AbsolutePath == "/postapi/test1")
           {
               using (var reader = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding))
               {
                   string requestData = reader.ReadToEnd();
                   Console.WriteLine($"Received POST data: {requestData}");
               }
               responseString = "{\"sites\":[{\"name\":\"菜鸟教程\",\"post_url\":\"www.runoob.com\"},{\"name\":\"google\",\"post_url\":\"www.google.com\"},{\"name\":\"微博\",\"post_url\":\"www.weibo.com\"}]}";
           }

           //跨域的
           context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
           context.Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
           context.Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type");

           byte[] buffer = Encoding.UTF8.GetBytes(responseString);
           context.Response.ContentLength64 = buffer.Length;

           context.Response.OutputStream.Write(buffer, 0, buffer.Length);
           context.Response.OutputStream.Close();
       }

       private void btnStopService_Click(object sender, EventArgs e)
       {
           StopService();
       }

       private void StopService()
       {
           if (listener != null && listener.IsListening)
           {
               isStopping = true;
               listener.Stop();
               listener.Close();

               listenerThread.Join();

               MessageBox.Show("服务已暂停");
           }
       }

       private void Form1_FormClosing(object sender, FormClosingEventArgs e)
       {
           StopService(); // 确保在窗体关闭时停止服务
       }

       /// <summary>
       /// 获取当前使用的IP
       /// </summary>
       /// <returns></returns>
       public string GetLocalIP()
       {
           string result = RunApp("route", "print", true);
           Match m = Regex.Match(result, @"0.0.0.0\s+0.0.0.0\s+(\d+.\d+.\d+.\d+)\s+(\d+.\d+.\d+.\d+)");
           if (m.Success)
           {
               return m.Groups[2].Value;
           }
           else
           {
               try
               {
                   System.Net.Sockets.TcpClient c = new System.Net.Sockets.TcpClient();
                   c.Connect("www.baidu.com", 80);
                   string ip = ((System.Net.IPEndPoint)c.Client.LocalEndPoint).Address.ToString();
                   c.Close();
                   return ip;
               }
               catch (Exception)
               {
                   return null;
               }
           }
       }

       /// <summary>
       /// 运行一个控制台程序并返回其输出参数。
       /// </summary>
       /// <param name="filename">程序名</param>
       /// <param name="arguments">输入参数</param>
       /// <returns></returns>
       public string RunApp(string filename, string arguments, bool recordLog)
       {
           try
           {
               if (recordLog)
               {
                   Trace.WriteLine(filename + " " + arguments);
               }
               Process proc = new Process();
               proc.StartInfo.FileName = filename;
               proc.StartInfo.CreateNoWindow = true;
               proc.StartInfo.Arguments = arguments;
               proc.StartInfo.RedirectStandardOutput = true;
               proc.StartInfo.UseShellExecute = false;
               proc.Start();

               using (System.IO.StreamReader sr = new System.IO.StreamReader(proc.StandardOutput.BaseStream, Encoding.Default))
               {
                   Thread.Sleep(100);           //貌似调用系统的nslookup还未返回数据或者数据未编码完成,程序就已经跳过直接执行
                                                //txt = sr.ReadToEnd()了,导致返回的数据为空,故睡眠令硬件反应
                   if (!proc.HasExited)         //在无参数调用nslookup后,可以继续输入命令继续操作,如果进程未停止就直接执行
                   {                            //txt = sr.ReadToEnd()程序就在等待输入,而且又无法输入,直接掐住无法继续运行
                       proc.Kill();
                   }
                   string txt = sr.ReadToEnd();
                   sr.Close();
                   if (recordLog)
                       Trace.WriteLine(txt);
                   return txt;
               }
           }
           catch (Exception ex)
           {
               Trace.WriteLine(ex);
               return ex.Message;
           }
       }
   }
}

需要在防火墙的规则中添加对应的端口:
在这里插入图片描述

在另外一个电脑中访问:
在这里插入图片描述

1:启动服务
2:展示一下另外一个电脑的IP地址
3:在浏览器中进行请求
4:请求完成显示信息

使用的html文件源码
需要修改代码中的IP地址:localhost 修改为服务器的IP地址。

<!DOCTYPE html>
<html>
<head>
    <title>CORS Test</title>
</head>
<body>
    <button onclick="fetchData()">Fetch Data</button>
    <div id="result"></div>

    <script>
        function fetchData() {
            fetch('http://localhost:18792/getapi/getadate/test2')
                .then(response => response.json())
                .then(data => {
                    document.getElementById('result').innerText = JSON.stringify(data, null, 2);
                })
                .catch(error => console.error('Error:', error));
        }
    </script>
</body>
</html>

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

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

相关文章

工作流activiti笔记(六)已办列表

待办列表可以用 taskService.createTaskQuery() 但是已办列表就比较麻烦了。为什么呢&#xff1f;直接查询act_hi_procinst是不行的&#xff0c;已办要查询每个环节是否有当前登录工号处理过的记录&#xff0c;那这个记录是在act_hi_taskinst里的。 方式一&#xff1a;left j…

金葫芦STM32L431上手流程

目录 教材书名和开发板 金葫芦STM32L431上手流程 IDE软件安装流程 IDE软件使用流程 第一步 第二步 第三步 第四步 第五步 第六步 教材书名和开发板 教材&#xff1a;《嵌入式技术基础与实践&#xff08;第6版&#xff09;》&#xff08;王宜怀主编&#xff09; 开发…

计算机人工智能前沿进展-大语言模型方向-2024-09-12

计算机人工智能前沿进展-大语言模型方向-2024-09-12 1. PharmaBench: Enhancing ADMET benchmarks with large language models Z Niu, X Xiao, W Wu, Q Cai, Y Jiang, W Jin, M Wang… - Scientific Data, 2024 大语言模型在药物发现中的应用&#xff1a;PharmaBench 文章由…

力扣题解815

大家好&#xff0c;欢迎来到无限大的频道。祝大家中秋节快乐​。 今日继续给大家带来力扣题解。 题目描述&#xff08;困难&#xff09;​&#xff1a; 公交路线 给你一个数组 routes &#xff0c;表示一系列公交线路&#xff0c;其中每个 routes[i] 表示一条公交线路&…

红黑树的插入(NGINX源码)

下载并查看NGINX源码 访问NGINX下载页面&#xff0c;找到所需版本 https://nginx.org/en/download.html 使用wget下载源码包&#xff0c;替换版本号为所需版本 wget http://nginx.org/download/nginx-1.24.0.tar.gz解压源码包 tar -xzvf nginx-1.24.0.tar.gz进入解压后的目…

Java的输入输出

秋招笔试很多都是要自己写输出输出的&#xff0c;所以对常见的整理一下&#xff0c;后续也会持续更新的~~~ 目录 1.java中的Scanner类 1.1next()方法和nextLine()方法的区别 1. next() 方法 示例 2. nextLine() 方法 示例 主要区别 使用场景 2.print类 3.常用的转换…

音频左右声道数据传输_2024年9月6日

如下为音频数据传输标准I2S总线的基本时序图 I2S slave将I2S master发送来的左右声道的串行数据DATA转变为16bit的并行数据 WS为左右声道选择信号&#xff0c;WS高代表左声道&#xff0c;WS低代表右声道; WS为高和为低都持续18个周期&#xff0c;前面16个周期用来传输数据。 I2…

npm安装时候报错certificate has expired

打开了一个很久没用的电脑&#xff0c;npm和node都装好了&#xff0c;安装包的时候一直报错 request to https://registry.npm.taobao.org/create-react-app failed, reason: certificate has expired而且先报错rollbackFailedOptional 然而npm没什么问题&#xff0c;是ssl过…

【数据结构与算法 | 灵神题单 | 自底向上DFS篇】力扣965, 2331, 100, 1379

1. 力扣965&#xff1a;单值二叉树 1.1 题目&#xff1a; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;[1,1,1,1,1,n…

UE5学习笔记22-武器瞄准和武器自动开火

0、一些疑问的记录 1.UUserWidget类和AHUD类的区别。两者都是关于界面显示的类。 实践&#xff1a; 想让界面和用户有交互使用UUserWidget&#xff0c;如果不要交互只是显示使用AHUD类&#xff0c;例如使用UUserWidget类制作开始界面&#xff0c;游戏开始&#xff0c;游戏设置&…

TensorRT-LLM——优化大型语言模型推理以实现最大性能的综合指南

引言 随着对大型语言模型 (LLM) 的需求不断增长&#xff0c;确保快速、高效和可扩展的推理变得比以往任何时候都更加重要。NVIDIA 的 TensorRT-LLM 通过提供一套专为 LLM 推理设计的强大工具和优化&#xff0c;TensorRT-LLM 可以应对这一挑战。TensorRT-LLM 提供了一系列令人印…

AD的入门操作

锦囊 1、打开AD后&#xff0c;一般默认打开上一个工程&#xff0c;这个时候如果想要打开新的工程&#xff0c;那就必须要创建一个项目&#xff0c;然后再在项目中添加原理图库和PCB库。 2、大多数情况下&#xff0c;直接使用库&#xff0c;不用自己再画原理图和封装库。 3、…

LeetCode[中等] 49.字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 思路&#xff1a; new Dictionary<string, List<string>>() 存储数据&#xff0c;key为排序之后的字符…

超高速传输 -- 相干光通信和非相干光通信

概述&#xff1a;技术对比 项目非相干光通信相干通信定义不需要相干本振光的光传输系统。采用本振光进行相干检测的光传输系统。调制解调技术发送端&#xff1a;强度调制。 接收端&#xff1a;直接检测。发送端&#xff1a;外调制。 接收端&#xff1a;本振光相干检测。码型幅…

完美的宝塔面板防御策略,基于 fail2ban

之前分享过宝塔面板配合fail2ban&#xff0c;以及开启cloudflare的cdn双重防御的教程&#xff0c;并制作了便捷的脚本这次不靠cloudflare的减速cdn&#xff0c;看看防御效果怎么样 系统环境 debian/ubuntu nginx 宝塔面板 注意要点 1.在宝塔面板开启站点日志 2.添加服务器白名…

加密与安全_HTTPS TLS 1.2 连接(RSA 握手)的整个过程解读

文章目录 HTTPS 数据传输的安全性保障SSL/TLS 作为混合加密系统的典范HTTPS TLS 1.2 连接&#xff08;RSA 握手&#xff09;的整个过程TLS 握手过程解析1. TCP 三次握手 (最顶部的黄色部分)2. TLS 握手阶段 (红色部分)2.1 Client Hello2.2 Server Hello2.3 CA 证书验证2.4 Clie…

[Python数据可视化]Plotly Express: 地图数据可视化的魅力

在数据分析和可视化的世界中&#xff0c;地图数据可视化是一个强大而直观的工具&#xff0c;它可以帮助我们更好地理解和解释地理数据。Python 的 Plotly Express 库提供了一个简单而强大的方式来创建各种地图。本文将通过一个简单的示例&#xff0c;展示如何使用 Plotly Expre…

【JavaWeb】利用IDEA2024+tomcat10配置web6.0版本搭建JavaWeb开发项目

之前写过一篇文章&#xff1a;《【JavaWeb】利用IntelliJ IDEA 2024.1.4 Tomcat10 搭建Java Web项目开发环境&#xff08;图文超详细&#xff09;》详细讲解了如何搭建JavaWeb项目的开发环境&#xff0c;里面默认使用的Web版本是4.0版本的。但在某些时候tomcat10可能无法运行we…

24年蓝桥杯及攻防世界赛题-MISC-1

2 What-is-this AZADI TOWER 3 Avatar 题目 一个恐怖份子上传了这张照片到社交网络。里面藏了什么信息&#xff1f;隐藏内容即flag 解题 ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc/outguess] └─$ outguess -r 035bfaa85410429495786d8ea6ecd296.jpg flag1.txt Rea…

iKuai使用及设置流程

iKuai使用及设置流程 iKuai安装步骤 一、配置主机 1.电脑连接ETH0网口 2.ETH1网口连接猫上面的千兆口 3.手动配置pc的IP地址和192.168.1.1./24在同一网段 3.浏览器输入192.168.1.1 admin admin 二、外网设置 1.直接联通电信网络设置 2.点击 网络设置-内外网设置-点击接…