C#网络编程入门之HTTP

简介:

C#网络编程入门之HTTP

目录:
C#网络编程入门系列包括三篇文章:

(一)C#网络编程入门之UDP

(二)C#网络编程入门之TCP

(三)C#网络编程入门之HTTP

一、概述
本文目的是通过C#代码提供一个HTTP服务,正常情况下如果我们需要向外界提供HTTP服务,常规做法就是通过ASP.NET来实现,有时我们的应用程序或Windows服务需要向外提供一些简单的HTTP服务就可以自己实现,从而避免部署IIS增加系统复杂性。这里必须强调是一些简单的应用,如果应用比较复杂,涉及到路径解析HTML解析等,还是用WEB方式实现比较靠谱。

将HTTP和UDP、TCP放在同一个系列实际上有一点不合适,因为UDP、TCP属于传输层协议,HTTP属于应用层协议,希望读者首先有一个明确的了解。

二、 提供服务
首先启动HHTP服务:

        if (!HttpListener.IsSupported)
        {
            Console.WriteLine("服务器操作系统不支持建立Http Server,需要更高版本的操作系统!");
            return;
        }

        HttpListener httpListener = new HttpListener();

        try
        {
            Console.WriteLine("正在启动Http服务");
            int port = 9000;
            httpListener.Prefixes.Add($"http://*:{port}/");
            httpListener.Start();               
            Console.WriteLine("Http服务启动成功。");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"启动Http服务出现异常:{ex.Message}");
            return;
        }

进行监听:

        while (true)
        {
            Console.WriteLine("开始监听...");
            HttpListenerContext context = httpListener.GetContext();
            HttpListenerRequest request = context.Request;

            string Method = request.HttpMethod.ToUpper();
            Console.WriteLine($"收到请求,URL:{ request.Url} Method:{Method}");               

            Response(context, "hello");
        }

代码循环进行监听,GetContext方法会引起阻塞,当收到浏览器请求时,服务器立即返回“Hello”。

Response方法实现如下:

    private static void Response(HttpListenerContext context, string responseTxt)
    {
        HttpListenerResponse response = context.Response;
        response.ContentType = "html";
        response.ContentEncoding = Encoding.UTF8;

        using (Stream output = response.OutputStream)
        {
            byte[] buffer2 = Encoding.UTF8.GetBytes(responseTxt);
            output.Write(buffer2, 0, buffer2.Length);
        }
    }

此时打开浏览器输入地址 http://localhosthost:9000/ 看一下能否看到结果。(如果需要通过其他机器访问,本机要开放防火墙对应端口。)

注意:程序需要以管理员模型运行才能提供服务。

具体办法:工程新增应用程序清单文件:app.manifest,修改配置信息如下:

 

   

     

       

     

   

 

三、 响应
通过request.HttpMethod可以取得协议类型,对于GET和POST方法将采取不同的处理方式。

通过request.RawUrl可以取得URL路径,并进行解析,通过request.QueryString可以用户输入的参数值。

         if (Method == "GET")
            {
                Console.WriteLine($"Get:RawURL:{ request.RawUrl}");

                if (request.RawUrl.StartsWith("/version"))
                {
                    Response(context, "Simple Http Server Ver:0.11");
                    continue;
                }
                else
                {
                    string username = request.QueryString["username"];
                    string pwd = request.QueryString["pwd"];

                    Response(context, $"Welcome:{username}");
                    continue;
                }
            }

以上代码,如果输入:http://localhost:9000?username=hahaha

输出:Welcome:hahaha

在POST方法下,仍然可以通过request.QueryString取得用户通过URL输入的参数,但通过Body传输的数据需要通过其他方式进行读取。

            if (Method == "POST")
            {
                Console.WriteLine($"POST:RawURL:{ request.RawUrl}");
                string content = GetPostInput(request);
                Console.WriteLine($"Content:{ content}");
               Response(context, "\"{'Result':'Success','Message':'Hello'}\"");
               continue;
            }

GetPostInput方法实现如下:

    private static string GetPostInput(HttpListenerRequest request)
    {
       Stream s = request.InputStream;
        int count = 0;
        byte[] buffer = new byte[1024];
        StringBuilder builder = new StringBuilder();
        while ((count = s.Read(buffer, 0, 1024)) > 0)
        {
            builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
        }
        s.Flush();
        s.Close();
        s.Dispose();
        return builder.ToString();
    }

为了方便起见,输入输出的数据最好采用json格式。

四、调试
可以通过Chrome或Postman来进行调试。

原文地址https://www.cnblogs.com/seabluescn/p/12972750.html

相关文章
|
3月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
218 61
|
3月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
4月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
131 18
|
5月前
|
安全 网络安全 定位技术
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
165 22
|
5月前
|
网络安全
网络问题解析:如何解决CondaHTTPError HTTP 000 CONNECTION FAILED错误。
以上就是斯诺普为你准备的解决Conda出现HTTP连接错误的手术室。希望这辆小车可以顺利驶出棘手的泥潭,再次在自由的大路上疾驰。一切的尝试和努力,只为更好的探索与开发。
209 17
|
6月前
|
缓存 监控 算法
基于 C# 网络套接字算法的局域网实时监控技术探究
在数字化办公与网络安全需求增长的背景下,局域网实时监控成为企业管理和安全防护的关键。本文介绍C#网络套接字算法在局域网实时监控中的应用,涵盖套接字创建、绑定监听、连接建立和数据传输等操作,并通过代码示例展示其实现方式。服务端和客户端通过套接字进行屏幕截图等数据的实时传输,保障网络稳定与信息安全。同时,文章探讨了算法的优缺点及优化方向,如异步编程、数据压缩与缓存、错误处理与重传机制,以提升系统性能。
123 2
|
6月前
|
人工智能 运维 API
云栖大会 | Terraform从入门到实践:快速构建你的第一张业务网络
云栖大会 | Terraform从入门到实践:快速构建你的第一张业务网络
194 1
|
9月前
|
前端开发 网络协议 安全
【网络原理】——HTTP协议、fiddler抓包
HTTP超文本传输,HTML,fiddler抓包,URL,urlencode,HTTP首行方法,GET方法,POST方法
|
9月前
|
JSON Dart 前端开发
鸿蒙应用开发从入门到入行 - 篇7:http网络请求
在本篇文章里,您将掌握鸿蒙开发工具DevEco的基本使用、ArkUI里的基础组件,并通过制作一个简单界面掌握使用
342 8
|
9月前
|
存储 JSON 缓存
【网络原理】——HTTP请求头中的属性
HTTP请求头,HOST、Content-Agent、Content-Type、User-Agent、Referer、Cookie。

热门文章

最新文章