ASP.NET一個簡易的WebServer,用控制台程式類比IIS 托起web服務

來源:互聯網
上載者:User

標籤:public   程式   控制台   

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:0px;" />

     ProcessRequestHandler( page,  query, TextWriter writer);      WebServer : MarshalByRefObject, IRegisteredObject    {          ProcessRequest( page,  query, TextWriter writer)        {            SimpleWorkerRequest worker =  SimpleWorkerRequest(page, query, writer);            HttpRuntime.ProcessRequest(worker);        }          Stop( immediate)        {            HostingEnvironment.UnregisterObject();        }    }      SimpleHttpListener    {        ProcessRequestHandler ProcessRequest;          SetProcessRequest(ProcessRequestHandler handler)        {            .ProcessRequest = handler;        }          PhysicRoot = .Empty;         public void Run()        {            if (!HttpListener.IsSupported)                throw new InvalidOperationException("使用 HttpListener 必須為 Windows XP SP2 或 Server 2003 以上系統!");            string[] prefixes = new string[] { "http://localhost:49152/" };            HttpListener listener = new HttpListener();            foreach (string item in prefixes)            {                listener.Prefixes.Add(item);            }            listener.Start();            Console.WriteLine("開始監聽.....");            while (true)            {                HttpListenerContext context = listener.GetContext();                HttpListenerRequest request = context.Request;                Console.WriteLine("{0} {1} HTTP/1.1", request.HttpMethod, request.RawUrl);                HttpListenerResponse response = context.Response;                using (StreamWriter writer = new StreamWriter(response.OutputStream))                {                    StringWriter sw = new StringWriter();                    string content = string.Empty;                    string filename = request.Url.LocalPath.ToLower();                    Regex reg = new Regex("(.aspx|.ashx|.svc|.asmx)");                    Match m = reg.Match(filename);                    if (m.Success)                    {                        string path = request.Url.AbsolutePath;                        string query = request.Url.Query.Replace("?", string.Empty);                        string prefx = m.Groups[0].Value;                        if (!filename.EndsWith(prefx))                        {                            int index = path.IndexOf(prefx);                            index = index + prefx.Length;                            query = path.Substring(index);                            path = path.Substring(0, index);                        }                        path = Path.GetFileName(path);                        this.ProcessRequest(path, query, sw);                        content = sw.ToString();                        sw.Close();                        response.ContentLength64 = Encoding.UTF8.GetByteCount(content);                        response.ContentType = "text/html; charset=UTF-8";                        writer.Write(content);                    }                    else                    {                        string filePath = Path.Combine(PhysicRoot, request.Url.AbsolutePath.Substring(1));                        lock (this)                        {                            byte[] buffer = new byte[4096];                            if (File.Exists(filePath))                            {                                using (StreamReader sr = new StreamReader(filePath))                                {                                    response.ContentLength64 = sr.BaseStream.Length;                                    int readLength = sr.BaseStream.Read(buffer, 0, buffer.Length);                                    while (readLength > 0)                                    {                                        writer.BaseStream.Write(buffer, 0, readLength);                                        readLength = sr.BaseStream.Read(buffer, 0, buffer.Length);                                    }                                }                            }                            else                            {                                string msg = "not found:" + filePath;                                byte[] data = Encoding.UTF8.GetBytes(msg);                                writer.BaseStream.Write(data, 0, data.Length);                            }                        }                    }                    Console.WriteLine("\r\nProcess Ok.\r\n");                }                if (Console.KeyAvailable)                    break;            }            listener.Stop();        }           Start()        {            PhysicRoot = ;            WebServer server = CreateWorkerAppDomainWithHost((WebServer), , PhysicRoot)  WebServer;                        SimpleHttpListener listener =  SimpleHttpListener();            listener.SetProcessRequest(server.ProcessRequest);            listener.Run();        }          CreateWorkerAppDomainWithHost(Type hostType,  virtualPath,  physicalPath)        {             uniqueAppString = .Concat(virtualPath, physicalPath).ToLowerInvariant();             appid = (uniqueAppString.GetHashCode()).ToString(, CultureInfo.InvariantCulture);             appmanager = ApplicationManager.GetApplicationManager();             buildManagerHostType = (HttpRuntime).Assembly.GetType();             buildManagerHost = appmanager.CreateObject(appid, buildManagerHostType, virtualPath, physicalPath, );            buildManagerHostType.InvokeMember(, BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic, , buildManagerHost,  [] { hostType.Assembly.FullName, hostType.Assembly.Location });             appmanager.CreateObject(appid, hostType, virtualPath, physicalPath, );        }    }

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="border:0px;" />


ASP.NET一個簡易的WebServer,用控制台程式類比IIS 托起web服務

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.