热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c#网络编程之http

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

一、概述

本文目的是通过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来进行调试。 

传送门:

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

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

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

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

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


推荐阅读
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • ECMA262规定typeof操作符的返回值和instanceof的使用方法
    本文介绍了ECMA262规定的typeof操作符对不同类型的变量的返回值,以及instanceof操作符的使用方法。同时还提到了在不同浏览器中对正则表达式应用typeof操作符的返回值的差异。 ... [详细]
  • 使用chrome编辑器实现网页截图功能的方法
    本文介绍了在chrome浏览器中使用编辑器实现网页截图功能的方法。通过在地址栏中输入特定命令,打开控制台并调用命令面板,用户可以方便地进行网页截图操作。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
author-avatar
rockminer
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有