Code Monkey home page Code Monkey logo

httpserver's Introduction

HttpServer

Build Status Sonar-HttpServer

一个使用C#编写的简易Web服务器, 目前支持:

  • 静态页面处理 😄
  • GET/POST请求 😄
  • 支持HTTPS协议 😄
  • 支持返回JSON 😟
  • 支持路由方法 😟

快速开始

HTTP服务器示例

class Program
{
    static void Main(string[] args)
    {
        ExampleServer server = new ExampleServer("0.0.0.0",4050);
        server.Start();
    }
}

GET/POST请求示例

 public override void OnPost(HttpRequest request, HttpResponse response)
 {
    //获取客户端传递的参数
    string data = request.Params == null ? "" : string.Join(";", request.Params.Select(x => x.Key + "=" + x.Value).ToArray());

    //设置返回信息
    string content = string.Format("这是通过Post方式返回的数据:{0}", data);

    //构造响应报文
    response.SetContent(content);
    response.Content_Encoding = "utf-8";
    response.StatusCode = "200";
    response.Content_Type = "text/html; charset=UTF-8";
    response.Server = "ExampleServer";

    //发送响应
    response.Send();
}

public override void OnGet(HttpRequest request, HttpResponse response)
{

    ///链接形式1:"http://localhost:4050/assets/styles/style.css"表示访问指定文件资源,
    ///此时读取服务器目录下的/assets/styles/style.css文件。

    ///链接形式1:"http://localhost:4050/assets/styles/"表示访问指定页面资源,
    ///此时读取服务器目录下的/assets/styles/style.index文件。

    //当文件不存在时应返回404状态码
    string requestURL = request.URL;
    requestURL = requestURL.Replace("/", @"\").Replace("\\..", "").TrimStart('\\');
    string requestFile = Path.Combine(ServerRoot, requestURL);

    //判断地址中是否存在扩展名
    string extension = Path.GetExtension(requestFile);

    //根据有无扩展名按照两种不同链接进行处
    if (extension != "")
    {
        //从文件中返回HTTP响应
        response = LoadFromFile(response, requestFile);
    } 
    else
    {
        //目录存在且不存在index页面时时列举目录
        if (Directory.Exists(requestFile) && !File.Exists(requestFile + "\\index.html"))
        {
            requestFile = Path.Combine(ServerRoot, requestFile);
            var content = ListDirectory(requestFile, requestURL);
            response = response.SetContent(content, Encoding.UTF8);
            response.Content_Type = "text/html; charset=UTF-8";
        } 
        else
        {
            //加载静态HTML页面
            requestFile = Path.Combine(requestFile, "index.html");
            response = LoadFromFile(response, requestFile);
            response.Content_Type = "text/html; charset=UTF-8";
        }
    }

    //发送HTTP响应
    response.Send();
}

httpserver's People

Contributors

acane77 avatar newfuture avatar outlier888 avatar qinyuanpei avatar summitn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

httpserver's Issues

获取POST结果数据不对哦

private string GetRequestData(Stream stream)
{
var length = 0;
var data = string.Empty;

        do
        {
            length = stream.Read(bytes, 0, MAX_SIZE - 1);
            data += Encoding.UTF8.GetString(bytes, 0, length);
        } while (length > 0 && !data.Contains("\r\n\r\n"));

        return data;
    }

获取数据的时候,少部分情况下正常。大部分情况下数据少了后面一点

HttpRequest请求头部Content加入数据在BaseHeader.GetRequestParams方法写法有误

原来写法:

///


/// 从内容中解析请求参数并返回一个字典
///

/// 使用&连接的参数字符串
/// 如果存在参数则返回参数否则返回null
protected Dictionary<string, string> GetRequestParams(string content)
{
//防御编程
if (string.IsNullOrEmpty(content))
return null;

        //按照&对字符进行分割
        string[] reval = content.Split('&');
        if (reval.Length <= 0)
            return null;

        //将结果添加至字典
        Dictionary<string, string> dict = new Dictionary<string, string>();
        foreach (string val in reval)
        {
            string[] kv = val.Split('=');
            if (kv.Length <= 1)
                dict.Add(kv[0], "");
                dict.Add(kv[0], kv[1]);
        }

        //返回字典
        return dict;
    }

kv会报错超出索引。忘记写else了吧。强烈建议if,else都上{ },要不然不容易看出来。
ps:dll挺好用的,已经尝试运用在项目中。

解析Http协议有问题

HttpRequest.cs里
private string GetRequestData(Stream stream)
{
var length = 0;
var data = string.Empty;

        do
        {
            length = stream.Read(bytes, 0, MAX_SIZE - 1);
            data += Encoding.UTF8.GetString(bytes, 0, length);
        } while (length > 0 && !data.Contains("\r\n\r\n"));

        return data;
    }

这个解析HTTP协议自己想想的,HTTP头和BODY不同时发送都处理不了。。

编译报错

HttpServer项目下ExampleServer类中
private HttpResponse LoadFromFile(HttpResponse response, string fileName)方法中
GetContentType这个方法没有找到,是不是还有未提交的代码啊?

error

CSC: error CS2001: Source file `TcpServer.cs' could not be found

我也来吐槽下这段代码

private string GetRequestData(Stream stream)
{
var length = 0;
var data = string.Empty;
        do
        {
            length = stream.Read(bytes, 0, MAX_SIZE - 1);
            data += Encoding.UTF8.GetString(bytes, 0, length);
        } while (length > 0 && !data.Contains("\r\n\r\n"));

        return data;
    }

data.Contains("\r\n\r\n"))这里是不是可以优化一下,每次都会从0开始查找这个\r\n\r\n

高并发就出问题了

服务器会抛下面这个异常
Unable to write data to the transport connection: 你的主机中的软件中止了一个已建立的连接。

位置:
HttpResponse.cs

Request Content头部加入内容读取问题

在一个项目使用HttpClient.SendAsync,使用post请求,并且在Content头部加入数据及部分内容。
1.使用你的项目运行调试,能够得到如下content结果:
POST /api/xxx/xxx HTTP/1.1
sign: 3FB30070C49074068CFDE5C852D3D0D9
Accept: application/json
KeepAlive: true
Content-Type: application/json
Host: 172.16.40.78:4050
Content-Length: 127
Expect: 100-continue
Connection: Keep-Alive

{"Id":"aaa"}

这样能够得到Params值,及{"Id":"aaa"}。

2.将你的项目debug或者release到我的项目中引用,运行调试则得到如下结果:
POST /api/xxx/xxx HTTP/1.1
sign: 3FB30070C49074068CFDE5C852D3D0D9
Accept: application/json
KeepAlive: true
Content-Type: application/json
Host: 172.16.40.78:4050
Content-Length: 127
Expect: 100-continue
Connection: Keep-Alive

无法读取到{"Id":"aaa"} 这个数据。确认过写法一致,使用方法,端口均保持一致,且尝试使用postman,得到内容相同。

你的项目本身独自运行没有任何问题。现在问题是加入到我的项目中,content读不到最后的数据问题?
不知道问题出在何处?能够有解决思路提供? 感谢。

HttpRequest构造函数在获取Request Body时进入死循环

        if (int.TryParse(contentLength, out var length) && Body.Length != length)
        {
            do
            {
                length = stream.Read(bytes, 0, MAX_SIZE - 1);
                Body += Encoding.UTF8.GetString(bytes, 0, length);
            } while (Body.Length != length);
        }

这段代中的while循环跳出不来,如果MAX_SIZE很大,则 length始终为0;如果MAX_SIZE很大,则 Body.Length 始终大于 length。

当我用multipart/form-data POST 上传图片时发生

关于https

nginx等框架使用ssl通道需指定.crt文件与.key文件,此项目如何实现指定两个文件?

CDN

关于CDN有什么好的思路来解决呢?通过网络来返回字节流然后发送到客户端吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.