1. 程式人生 > 實用技巧 >C# .net基於Http實現web server(web服務)

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

指令碼,JSP(JavaServer Pages)指令碼,servlets,ASP(Active Server Pages)指令碼,伺服器端(server-side)JavaScript,或者一些其它的伺服器端(server-side)技術。無論它們(譯者注:指令碼)的目的如何,這些伺服器端(server-side)的程式通常產生一個HTML的響應(response)來讓瀏覽器可以瀏覽。

通俗的講,Web伺服器傳送(serves)頁面使瀏覽器可以瀏覽,然而應用程式伺服器提供的是客戶端應用程式可以呼叫(call)的方法(methods)。確切一點,你可以說:Web伺服器專門處理HTTP請求(request),但是
應用程式
伺服器是通過很多協議來為應用程式提供(serves)商業邏輯(business logic)。 常用的web Server

我們常用的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://wenku.baidu.com/link?url=105Uuf34jmjbFnNEp1YTw1ry3Rx7_bXoKWQvLciQRUg9g5wJpViAedTYP45yUcruGEjuL7lACtwyu2g2KplUhOLA5XCLKbrY1NzWf7Ah1Fe

http://msdn.microsoft.com/zh-cn/library/system.net.httplistener(v=vs.110).aspx