欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c# 網(wǎng)絡(luò)編程之http

 更新時間:2021年02月19日 10:47:38   作者:seabluescn  
這篇文章主要介紹了c# 提供一個HTTP服務(wù)的實現(xiàn)示例,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下

一、概述

本文目的是通過C#代碼提供一個HTTP服務(wù),正常情況下如果我們需要向外界提供HTTP服務(wù),常規(guī)做法就是通過ASP.NET來實現(xiàn),有時我們的應(yīng)用程序或Windows服務(wù)需要向外提供一些簡單的HTTP服務(wù)就可以自己實現(xiàn),從而避免部署IIS增加系統(tǒng)復(fù)雜性。這里必須強(qiáng)調(diào)是一些簡單的應(yīng)用,如果應(yīng)用比較復(fù)雜,涉及到路徑解析HTML解析等,還是用WEB方式實現(xiàn)比較靠譜。

將HTTP和UDP、TCP放在同一個系列實際上有一點不合適,因為UDP、TCP屬于傳輸層協(xié)議,HTTP屬于應(yīng)用層協(xié)議,希望讀者首先有一個明確的了解。

二、 提供服務(wù)

首先啟動HHTP服務(wù):

if (!HttpListener.IsSupported)
  {
  Console.WriteLine("服務(wù)器操作系統(tǒng)不支持建立Http Server,需要更高版本的操作系統(tǒng)!");
  return;
  }

  HttpListener httpListener = new HttpListener();

  try
  {
  Console.WriteLine("正在啟動Http服務(wù)");
  int port = 9000;
  httpListener.Prefixes.Add($"http://*:{port}/");
  httpListener.Start();  
  Console.WriteLine("Http服務(wù)啟動成功。");
  }
  catch (Exception ex)
  {
  Console.WriteLine($"啟動Http服務(wù)出現(xiàn)異常:{ex.Message}");
  return;
  }

進(jìn)行監(jiān)聽:

while (true)
  {
  Console.WriteLine("開始監(jiān)聽...");
  HttpListenerContext context = httpListener.GetContext();
  HttpListenerRequest request = context.Request;

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

  Response(context, "hello");
  }

代碼循環(huán)進(jìn)行監(jiān)聽,GetContext方法會引起阻塞,當(dāng)收到瀏覽器請求時,服務(wù)器立即返回“Hello”。

Response方法實現(xiàn)如下:

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/ 看一下能否看到結(jié)果。(如果需要通過其他機(jī)器訪問,本機(jī)要開放防火墻對應(yīng)端口。)

注意:程序需要以管理員模型運行才能提供服務(wù)。

具體辦法:工程新增應(yīng)用程序清單文件:app.manifest,修改配置信息如下:

  <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>

三、 響應(yīng)

通過request.HttpMethod可以取得協(xié)議類型,對于GET和POST方法將采取不同的處理方式。

通過request.RawUrl可以取得URL路徑,并進(jìn)行解析,通過request.QueryString可以用戶輸入的參數(shù)值。

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輸入的參數(shù),但通過Body傳輸?shù)臄?shù)據(jù)需要通過其他方式進(jìn)行讀取。

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方法實現(xiàn)如下:

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();
 }

為了方便起見,輸入輸出的數(shù)據(jù)最好采用json格式。 

四、調(diào)試

可以通過Chrome或Postman來進(jìn)行調(diào)試。 

傳送門:

C#網(wǎng)絡(luò)編程入門系列包括三篇文章:

(一)C#網(wǎng)絡(luò)編程入門之UDP

(二)C#網(wǎng)絡(luò)編程入門之TCP

(三)C#網(wǎng)絡(luò)編程入門之HTTP

以上就是c# 提供一個HTTP服務(wù)的實現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于c# 提供http服務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#中dynamic的使用方法及應(yīng)用場景

    C#中dynamic的使用方法及應(yīng)用場景

    在 C# 編程中,dynamic 類型是一個非常特殊的類型,它在編譯時并不會進(jìn)行類型檢查,而是在運行時才進(jìn)行類型解析,本文將詳細(xì)講解 dynamic 的使用方法、優(yōu)缺點以及一些實際應(yīng)用場景,需要的朋友可以參考下
    2024-08-08
  • C# StringBuilder和string

    C# StringBuilder和string

    這篇文章主要介紹了C# StringBuilder和string,文章圍繞StringBuilder和string的相關(guān)資料展開內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • C# DropDownList中點擊打開新窗口的方法

    C# DropDownList中點擊打開新窗口的方法

    C# DropDownList中點擊打開新窗口的方法,需要的朋友可以參考一下
    2013-03-03
  • C#服務(wù)器NFS共享文件夾搭建與上傳圖片文件的實現(xiàn)

    C#服務(wù)器NFS共享文件夾搭建與上傳圖片文件的實現(xiàn)

    本文主要介紹了C#服務(wù)器NFS共享文件夾搭建與上傳圖片文件的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C#中數(shù)組Array,ArrayList,泛型List詳細(xì)對比

    C#中數(shù)組Array,ArrayList,泛型List詳細(xì)對比

    關(guān)于數(shù)組Array,ArrayList,泛型List,簡單的說數(shù)組就是值對象,它存儲數(shù)據(jù)元素類型的值的一系列位置.Arraylist和list可以提供添加,刪除,等操作的數(shù)據(jù). 具體如何進(jìn)行選擇使用呢,我們來詳細(xì)探討下
    2016-06-06
  • C# Socket連接請求超時機(jī)制實現(xiàn)代碼分享

    C# Socket連接請求超時機(jī)制實現(xiàn)代碼分享

    這篇文章主要介紹了C# Socket連接請求超時機(jī)制實現(xiàn),下面提供代碼分享,大家可以參考使用
    2013-12-12
  • C# cefSharep控件的使用詳情

    C# cefSharep控件的使用詳情

    本文主要介紹了C# cefSharep控件的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • C#中委托的基礎(chǔ)入門與實現(xiàn)方法

    C#中委托的基礎(chǔ)入門與實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于C#中委托的基礎(chǔ)入門與實現(xiàn)方法的相關(guān)資料,究竟什么是委托,用最通俗易懂的話來講,你就可以把委托看成是用來執(zhí)行方法(函數(shù))的一個東西,需要的朋友可以參考下
    2021-08-08
  • c#中WinForm使用OpencvSharp4實現(xiàn)簡易抓邊

    c#中WinForm使用OpencvSharp4實現(xiàn)簡易抓邊

    本文主要介紹了c#中WinForm使用OpencvSharp4實現(xiàn)簡易抓邊,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • WPF ComboBox獲取當(dāng)前選擇值的實例詳解

    WPF ComboBox獲取當(dāng)前選擇值的實例詳解

    這篇文章主要介紹了WPF ComboBox獲取當(dāng)前選擇值的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論