ASP.NET一个简易的WebServer,用控制台程序模拟IIS 托起web服务

来源:互联网 发布:linux hexdump命令 编辑:程序博客网 时间:2024/06/06 04:50

ASP.NET一个简易的WebServer,用控制台程序模拟IIS 托起web服务

http://www.cnblogs.com/majiang/archive/2012/07/07/2580791.html

写了一个简单WebServer 服务器,可以处理js、css、html、aspx的请求,以及图片、视频

代码如下:

复制代码
  public delegate void ProcessRequestHandler(string page, string query, TextWriter writer);    public class WebServer : MarshalByRefObject, IRegisteredObject    {        public void ProcessRequest(string page, string query, TextWriter writer)        {            SimpleWorkerRequest worker = new SimpleWorkerRequest(page, query, writer);            HttpRuntime.ProcessRequest(worker);        }        public void Stop(bool immediate)        {            HostingEnvironment.UnregisterObject(this);        }    }    public class SimpleHttpListener    {        ProcessRequestHandler ProcessRequest;        public void SetProcessRequest(ProcessRequestHandler handler)        {            this.ProcessRequest = handler;        }        static string PhysicRoot = string.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();        }        public static void Start()        {            PhysicRoot = @"C:\Users\majiang\Documents\Visual Studio 2010\Projects\Jquery\Jquery";            WebServer server = CreateWorkerAppDomainWithHost(typeof(WebServer), "/", PhysicRoot) as WebServer;            //WebServer server = ApplicationHost.CreateApplicationHost(typeof(WebServer), "/", @"C:\Users\majiang\Documents\Visual Studio 2010\Projects\Jquery\Jquery") as WebServer;            SimpleHttpListener listener = new SimpleHttpListener();            listener.SetProcessRequest(server.ProcessRequest);            listener.Run();        }        static object CreateWorkerAppDomainWithHost(Type hostType, string virtualPath, string physicalPath)        {            string uniqueAppString = string.Concat(virtualPath, physicalPath).ToLowerInvariant();            string appid = (uniqueAppString.GetHashCode()).ToString("X", CultureInfo.InvariantCulture);            var appmanager = ApplicationManager.GetApplicationManager();            var buildManagerHostType = typeof(HttpRuntime).Assembly.GetType("System.Web.Compilation.BuildManagerHost");            var buildManagerHost = appmanager.CreateObject(appid, buildManagerHostType, virtualPath, physicalPath, false);            buildManagerHostType.InvokeMember("RegisterAssembly", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic, null, buildManagerHost, new object[] { hostType.Assembly.FullName, hostType.Assembly.Location });            return appmanager.CreateObject(appid, hostType, virtualPath, physicalPath, false);        }    }
复制代码
阅读全文
0 0
原创粉丝点击