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

相关文章
|
2月前
|
开发框架 .NET API
RESTful API 设计与实现:C# 开发者的一分钟入门
【10月更文挑战第5天】本文从零开始,介绍了如何使用 C# 和 ASP.NET Core 设计并实现一个简单的 RESTful API。首先解释了 RESTful API 的概念及其核心原则,然后详细说明了设计 RESTful API 的关键步骤,包括资源识别、URI 设计、HTTP 方法选择、状态码使用和错误处理。最后,通过一个用户管理 API 的示例,演示了如何创建项目、定义模型、实现控制器及运行测试,帮助读者掌握 RESTful API 的开发技巧。
75 7
|
2月前
|
C#
C#入门
C#入门
28 0
|
1月前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
49 13
|
2月前
|
Java 网络架构 Kotlin
kotlin+springboot入门级别教程,教你如何用kotlin和springboot搭建http
本文是一个入门级教程,介绍了如何使用Kotlin和Spring Boot搭建HTTP服务,并强调了Kotlin的空安全性特性。
84 7
kotlin+springboot入门级别教程,教你如何用kotlin和springboot搭建http
|
1月前
|
程序员 C# 图形学
全面的C#/.NET自学入门指南
全面的C#/.NET自学入门指南
|
2月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
69 8
|
3月前
|
JSON API 开发者
Python网络编程新纪元:urllib与requests库,让你的HTTP请求无所不能
【9月更文挑战第9天】随着互联网的发展,网络编程成为现代软件开发的关键部分。Python凭借简洁、易读及强大的特性,在该领域展现出独特魅力。本文介绍了Python标准库中的`urllib`和第三方库`requests`在处理HTTP请求方面的优势。`urllib`虽API底层但功能全面,适用于深入控制HTTP请求;而`requests`则以简洁的API和人性化设计著称,使HTTP请求变得简单高效。两者互补共存,共同推动Python网络编程进入全新纪元,无论初学者还是资深开发者都能从中受益。
52 7
|
2月前
|
JSON API 开发者
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
22 0
|
3月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
3月前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
86 0

热门文章

最新文章