服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - c# 网络编程之http

c# 网络编程之http

2022-11-01 14:57seabluescn C#

这篇文章主要介绍了c# 提供一个HTTP服务的实现示例,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下

一、概述

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

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

 

二、 提供服务

首先启动HHTP服务:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
  }

进行监听:

?
1
2
3
4
5
6
7
8
9
10
11
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方法实现如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
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,修改配置信息如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
 
    <security>
 
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">       
 
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
 
      </requestedPrivileges>
 
    </security>
 
  </trustInfo>

 

三、 响应

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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传输的数据需要通过其他方式进行读取。

?
1
2
3
4
5
6
7
8
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方法实现如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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来进行调试。 

 

传送门:

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

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

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

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

以上就是c# 提供一个HTTP服务的实现示例的详细内容,更多关于c# 提供http服务的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/seabluescn/p/12972750.html

延伸 · 阅读

精彩推荐
  • C#C#中try...catch的使用与常见面试题分享

    C#中try...catch的使用与常见面试题分享

    这篇文章首先给大家介绍了关于C#中try...catch的语法,而后又给大家分享了关于C#中try...catch最常见的面试题,具有一定的参考借鉴价值,需要的朋友们下面...

    wolfy10832021-12-27
  • C#Unity读取Excel文件转换XML格式文件

    Unity读取Excel文件转换XML格式文件

    这篇文章主要为大家详细介绍了Unity读取Excel文件转换XML格式文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    于子潇7752022-09-16
  • C#值得永久收藏的 C# 设计模式套路

    值得永久收藏的 C# 设计模式套路

    关于设计模式的说法,网上一搜一大堆,咱就不再去说了。我的理解,设计模式就是很多NB的大佬们总结出来的,用来处理特定情况的标准解决方案。...

    老王Plus10212021-11-10
  • C#C#中的Action、Func和Predicate如何使用

    C#中的Action、Func和Predicate如何使用

    这篇文章主要给大家介绍了关于C#中Action、Func和Predicate如何使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学...

    码农读书11172022-10-19
  • C#C#中倒序输出字符串的方法示例

    C#中倒序输出字符串的方法示例

    这篇文章主要给大家介绍了C#中倒序输出字符串的方法示例,本文中的字符串倒序指的是将“吗? 好 近 最”输出“最 近 好 吗?”,文中给出了两种方法,...

    Yesi11332021-12-18
  • C#C#操作数据库中存取图片文件的方法

    C#操作数据库中存取图片文件的方法

    这篇文章主要介绍了C#操作数据库中存取图片文件的方法,以实例形式分析了C#将图片存入数据库及从数据库读取图片文件的相关技巧,具有一定参考借鉴价值...

    weiren200611012021-10-28
  • C#C#中利用正则表达式将人民币金额转换为大写汉字

    C#中利用正则表达式将人民币金额转换为大写汉字

    这篇文章主要介绍了C#中利用正则表达式将人民币金额转换为大写汉字的方法,需要的朋友可以参考下...

    无机战士4132021-06-17
  • C#c# 用Base64实现文件上传

    c# 用Base64实现文件上传

    这篇文章主要介绍了c# 用Base64实现文件上传的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    Charles_Su7102022-09-29