C# .net基於Http實現web server(web服務)
什麼是 web server?
百度百科是這麼解釋的:
Web Server中文名稱叫網頁伺服器或web伺服器。WEB伺服器也稱為WWW(WORLD WIDE WEB)伺服器,主要功能是提供網上資訊瀏覽服務。
Web伺服器可以解析(handles)HTTP協議。當Web伺服器接收到一個HTTP請求(request),會返回一個HTTP響應(response),例如送回一個HTML頁面。為了處理一個請求(request),Web伺服器可以響應(response)一個靜態頁面或圖片,進行頁面跳轉(redirect),或者把動態響應(dynamic response)的產生委託(delegate)給一些其它的程式例如CGI
我們常用的web服務,是IIS,tomcat等。在進行網路通訊的時候我們還會用到socket,甚至可以基於socket來實現HTTP通訊,不過我們看一下更簡單的實現。
我們能用來做什麼?
IIS是非常強大的,功能齊全。我們的目標不是做一個和它一樣的web server。而是基於這樣的理念為我們的開發和架構服務。
特性和用處:
比如在我們的軟體中 需要在多個應用程式通訊時。
專用的功能帶來更高的效率,比如我們僅僅處理某幾一個網頁的顯示。我們見過路由裡的那個管理路由器的頁面吧,那就是一個輕量級的小web server實現,它可放不下一個windows + iis;
內嵌的windows應用程式,比如我們想在winform裡嵌入webBrower,配合它來做一些應用。
我們的實現
基於 .net 框架的HttpListener 類 來處理http協議,我們只需要基於它寫一個自己的處理類。
namespace HttpListenerDemo { static class Program { /// <summary> /// 應用程式的主入口點。 /// </summary> [STAThread] static void Main() { HttpListener httpListenner; httpListenner = new HttpListener(); httpListenner.AuthenticationSchemes = AuthenticationSchemes.Anonymous; httpListenner.Prefixes.Add("http://localhost:8090/"); httpListenner.Start(); new Thread(new ThreadStart(delegate { try { loop(httpListenner); } catch (Exception) { httpListenner.Stop(); } })).Start(); } private static void loop(HttpListener httpListenner) { while (true) { HttpListenerContext context = httpListenner.GetContext(); HttpListenerRequest request = context.Request; HttpListenerResponse response = context.Response; Servlet servlet = new MyServlet(); servlet.onCreate(); if (request.HttpMethod == "POST") { servlet.onPost(request, response); } else if (request.HttpMethod == "GET") { servlet.onGet(request, response); } response.Close(); } } } } public class Servlet { public virtual void onGet(System.Net.HttpListenerRequest request, System.Net.HttpListenerResponse response) { } public virtual void onPost(System.Net.HttpListenerRequest request, System.Net.HttpListenerResponse response) { } public virtual void onCreate() { } } public class MyServlet : HttpListenerDemo.Servlet { public override void onCreate() { base.onCreate(); } public override void onGet(HttpListenerRequest request, HttpListenerResponse response) { Console.WriteLine("GET:" + request.Url); byte[] buffer = Encoding.UTF8.GetBytes("OK"); System.IO.Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); // You must close the output stream. output.Close(); //listener.Stop(); } public override void onPost(HttpListenerRequest request, HttpListenerResponse response) { Console.WriteLine("POST:" + request.Url); byte[] res = Encoding.UTF8.GetBytes("OK"); response.OutputStream.Write(res, 0, res.Length); } }
如何使用?
1.寫一個class 繼承自Servlet 類,在這裡做具體的 業務邏輯實現。
2.複製main方法裡的程式碼,在合適的實際 啟動 httpListener。
http://msdn.microsoft.com/zh-cn/library/system.net.httplistener(v=vs.110).aspx