c# 網(wǎng)絡(luò)編程之http
一、概述
本文目的是通過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# 提供一個HTTP服務(wù)的實現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于c# 提供http服務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!
- C# TcpClient網(wǎng)絡(luò)編程傳輸文件的示例
- C# 網(wǎng)絡(luò)編程之UDP
- c# 網(wǎng)絡(luò)編程之tcp
- 深入學(xué)習(xí)C#網(wǎng)絡(luò)編程之HTTP應(yīng)用編程(下)
- 深入學(xué)習(xí)C#網(wǎng)絡(luò)編程之HTTP應(yīng)用編程(上)
- 淺談C#網(wǎng)絡(luò)編程詳解篇
- 詳解C# 網(wǎng)絡(luò)編程系列:實現(xiàn)類似QQ的即時通信程序
- 總結(jié)C#網(wǎng)絡(luò)編程中對于Cookie的設(shè)定要點
- C# Socket網(wǎng)絡(luò)編程實例
- C#網(wǎng)絡(luò)編程基礎(chǔ)之進(jìn)程和線程詳解
- c# socket網(wǎng)絡(luò)編程接收發(fā)送數(shù)據(jù)示例代碼
- C#開發(fā)之Socket網(wǎng)絡(luò)編程TCP/IP層次模型、端口及報文等探討
- C#網(wǎng)絡(luò)編程中常用特性介紹
相關(guān)文章
ItemsControl 數(shù)據(jù)綁定的兩種方式
這篇文章主要介紹了ItemsControl 數(shù)據(jù)綁定的兩種方式,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03
C#使用RabbitMQ發(fā)送和接收消息工具類的實現(xiàn)
RabbitMQ是一個消息的代理器,用于接收和發(fā)送消息,本文主要介紹了C#使用RabbitMQ發(fā)送和接收消息工具類的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-12-12
C#中的應(yīng)用程序接口介紹及實現(xiàn),密封類與密封方法
今天小編就為大家分享一篇關(guān)于C#中的應(yīng)用程序接口介紹及實現(xiàn),密封類與密封方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
Unity3D基于陀螺儀實現(xiàn)VR相機(jī)功能
這篇文章主要為大家詳細(xì)介紹了Unity3D基于陀螺儀實現(xiàn)VR相機(jī)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04
C#?網(wǎng)域賬號(Domain)驗證的實現(xiàn)
本文主要介紹了C#?網(wǎng)域賬號(Domain)驗證的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04

