C# web伺服器 源碼,無需IIS環境,針對ajax處理

来源:http://www.cnblogs.com/dukk/archive/2016/02/18/iis_object.html
-Advertisement-
Play Games

一個c#寫的的web伺服器,只進行簡單的處理HTTP請求,第一次寫,功能比較簡單,比較適合做API伺服器 因為是類的方式,可以嵌入任何程式中 代碼 using System;using System.Net;using System.Net.Sockets;using System.Text;usi


一個c#寫的的web伺服器,只進行簡單的處理HTTP請求,第一次寫,功能比較簡單,比較適合做API伺服器

因為是類的方式,可以嵌入任何程式中

代碼

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace Web
{
class HTTPServer
{
private const int BufferSize = 4096;

private TcpListener Tcp;

/// <summary>
/// 最多每秒請求處理次數
/// </summary>
public static int MaxRequest = 1000;

/// <summary>
/// 第一個參數是請求方式,第二個參數是請求地址,返回值為你處理好的結果
/// </summary>
public static Func<string, string, string> Response { get; set; }

/// <summary>
/// 設置消息編碼方式
/// </summary>
public static Encoding coding = Encoding.UTF8;

public HTTPServer(int port = 80)
{
//啟動監聽程式
Tcp = new TcpListener(IPAddress.Any, port);
Tcp.Start();
Console.WriteLine("服務已經啟動了");

while (true)
{
while (!Tcp.Pending())
{
Thread.Sleep(1000 / MaxRequest);
}
//啟動接受線程
ThreadStart(HandleThread);
}
}

public void HandleThread()
{
Socket socket = Tcp.AcceptSocket();

Byte[] readclientchar = new Byte[BufferSize];
int rc = socket.Receive(readclientchar, 0, BufferSize, SocketFlags.None);
string[] RequestLines = coding.GetString(readclientchar, 0, rc)
.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

string[] strs = RequestLines[0].Split(' ');
if (Response != null)
{
SendResponse(socket, Response(strs[0], strs[1]));

}
else {
SendResponse(socket, "請求成功,但是未進行任何處理");
}
socket.Close();
}

void SendResponse(Socket socket, string str)//發送文件(文件頭和內容)
{
Action<string> send = (s) => { socket.Send(coding.GetBytes(s)); };

send("HTTP/1.1 200 OK\r\n");
send("Content-Type:application/json; charset=utf-8\r\n");
send("Content-Length:" + str.Length + 2 + "\r\n");
//發送一個空行
send("\r\n");
send(str);
}

public static HTTPServer Create(int port = 80)
{

HTTPServer server = null;
ThreadStart(() => { server = new HTTPServer(port); });
return server;
}

private static void ThreadStart(Action action)
{
ThreadStart myThreadStart = new ThreadStart(action);
Thread myWorkerThread = new Thread(myThreadStart);
myWorkerThread.Start();
}

}
}

調用方式兩種

1. new HTTPServer()  --------這種方式有一個弊端就是,在程式中,會阻塞當前線程,無法進行其他操作

2. HTTPServer.Create()  ----這種方式在創建的適合執行的是多線程操作,可以在當前線程中繼續處理其他事

 

處理方法 

HTTPServer中有一個委托方法Response,第一個參數是請求方式,第二個參數是請求地址,返回值為你處理好的結果

以下是示列代碼

 

static void Main(string[] args)
{
HTTPServer.Response = Response;
//new HTTPServer(1234);
HTTPServer ser = HTTPServer.Create(1234);
}

public static string Response(string methed, string url)
{
return "[{\"Id\":22,\"Name\":\"二班\"},{\"Id\":1,\"Name\":\"一班\"}]";
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 因為業務系統需求,需要對web服務作nginx代理,在不斷的嘗試過程中,簡單總結了一下常見的nginx代理配置。 1. 最簡反向代理配置 在http節點下,使用upstream配置服務地址,使用server的location配置代理映射。 upstream my_server { server 10
  • JDK1.4.2的安裝 Do you agree to the above license terms? [yes or no] yes Unpacking... tail: cannot open `+511' for reading: No such file or directory Chec
  • 作者: "@gzdaijie" 本文為作者原創,轉載請註明出處:http://www.cnblogs.com/gzdaijie/p/5194033.html 1.寫在前面 & 160;& 160;& 160;& 160;當你在Windows上安裝了一臺Linux的虛擬機,你想訪問Linux中的文件夾
  • 1.0 反序列化時的對象屬性類型定義錯誤. 字元串類型用整型接收.(導致一直反序列化失敗.) 2.0 HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(strUrl); myReq.Timeout = timeout; //ti
  • 很多情況下,列表顯示數據. 如果經過數據篩選或者搜索,依然是可以重用視圖的. 如何重用? ViewBag.Data=...;//保存數據. 或者, View(model);//傳model
  • UniformGrid:特殊的Grid,所有單元格相同尺寸。 Canvas:跟html5的canvas很像,也可以像winform那樣基於坐標佈局 Grid:網頁的table GridSplitter:Grid里的分隔符,可以拖動調整大小 //ShowsPreview="True" 拖拽不會立即調整...
  • 使用 HttpApplication 對象 ASP.NET 框架中的許多類都提供了許多很方便的屬性可以直接映射到 HttpContext 類中定義的屬性。這種交疊有一個很好的例子就是 HttpApplication,它就是全局應用類的基類,在下表中,你可以看到 HttpApplication 類中定
  • RAML是Restful API Modeling Language的縮寫,是用來描述API信息的文檔。 創建一個.raml尾碼的文件,用Atom打開。 基本用法 #%RAML 0.8 title: Book API baseUri: http://api.book.com/{version} ve
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...