C#建立最简单的web服务,无需IIS

时间:2021-07-07 02:10:45

软件架构师何志丹

本程序仅仅是入门级程序。所以不考虑
1。多线程。
2,,安全性。


3,不考虑端点下载文件。
4,Keep-Alive。


5,不考虑head。
6,为了简洁,删掉了catch的内容。

exe的祖父目录必须有wwwroot目录,且目录有index.htm,内容不限。 
开发环境: WinXP+VS2010C#

一。新建一个项目TestWeb。项目类型:Windows窗体应用程序。
二。新建类RequestProcessor。
 using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Diagnostics;

namespace TestWeb
{
    class RequestProcessor
    {
        public bool ParseRequestAndProcess(string[] RequestLines)//解析内容
        {
            for (int i = 0; i < RequestLines.Length; i++)
                System.Diagnostics.Trace.Write(RequestLines[i]);

            char[] sp = new Char[1] { ‘ ‘ };
            string[] strs = RequestLines[0].Split(sp);
            if (strs[0] == "GET")
            {
                Send(strs[1], 0, 0);
            }

            return false;
        }

        void Send(string filename, long start, long length)//发送文件(文件头和文件)
        {
            string strFileName = GetPathFileName(filename);
            FileStream fs = null;
            try
            {
                fs = new FileStream(strFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

            }
            catch (IOException)// FileNotFoundException)
            {//不能将 e.Message,发给浏览器,否则会有安全隐患的
                SendHeadrAndStr("打开文件" + filename + "失败。

");
                return;
            }

            if (length == 0)
                length = fs.Length - start;

            SendHeader("text/html", (fs.Length == length), start, length);
            sendContent(fs, start, length);
        }

        public void SendHeadrAndStr(String str)//直接将str的内容发给html
        {
            byte[] sendchars = Encoding.Default.GetBytes((str).ToCharArray());
            SendHeader("text/html", true, 0, sendchars.Length);
            SendStr(Encoding.Default, str);
        }

        private void SendHeader(string fileType, bool bAll, long start, long length)//发送文件头
        {
            try
            {
                Encoding coding = Encoding.Default;
                string strSend;
                string strState = (bAll) ?