You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何指定C# HTTP服务器根目录并解决转义序列无法识别报错

问题原因

你遇到的「Unrecognized escape sequence」报错是C#的基础语法问题:C#中普通字符串内的反斜杠\是转义字符,\P、\A、\w这类组合不属于C#合法的转义序列,因此编译不通过。

修复方案

1. 直接修复编译报错

你可以选任意一种方式修改第140行的路径定义:

  • 方式一:用双反斜杠表示路径中的真实反斜杠
String resBody = "C:\\Program Files\\Ampps\\www";
  • 方式二:在字符串前加@声明为逐字字符串,转义字符会自动失效
String resBody = @"C:\Program Files\Ampps\www";

2. 实现真正的静态文件服务

你当前的写法只是把路径字符串直接返回给请求端,并没有实现读取指定根目录下对应文件的功能,要完成需求还要补充以下逻辑:

  1. 解析HTTP请求头,提取请求的资源路径
  2. 将请求路径和你配置的根目录拼接得到本地文件路径
  3. 判断文件是否存在,存在则读取文件内容作为响应体返回,不存在则返回404状态码
  4. 根据文件后缀设置对应的Content-Type,保证浏览器能正常解析资源

修改后的核心代码参考(startListeningForConnection方法部分)

private void startListeningForConnection()
{
    // 定义静态文件根目录
    string rootPath = @"C:\Program Files\Ampps\www";
    while (true)
    {
        String data = "";
        byte[] bytes = new byte[2048];
        Socket client = httpServer.Accept();

        // 读取请求数据
        while (true)
        {
            int numBytes = client.Receive(bytes);
            data += Encoding.ASCII.GetString(bytes, 0, numBytes);
            if (data.IndexOf("\r\n") > -1)
                break;
        }

        // 记录请求日志
        serverLogsText.Invoke((MethodInvoker)delegate {
            serverLogsText.Text += "\r\n\r\n" + data + "\n\n------ End of Request -------";
        });

        // 解析请求路径
        string[] requestLines = data.Split(new[] { "\r\n" }, StringSplitOptions.None);
        string requestLine = requestLines[0];
        string[] requestParts = requestLine.Split(' ');
        string requestPath = requestParts[1];
        if (requestPath == "/") requestPath = "/index.html";
        string fullPath = Path.Combine(rootPath, requestPath.TrimStart('/'));

        string resHeader;
        byte[] resBodyBytes;
        if (File.Exists(fullPath))
        {
            // 存在对应文件,读取返回
            resHeader = "HTTP/1.1 200 OK\nServer: my_csharp_server\n";
            // 简单处理Content-Type,可根据需求补充更多后缀
            string ext = Path.GetExtension(fullPath).ToLower();
            resHeader += ext switch
            {
                ".html" => "Content-Type: text/html; charset=UTF-8\n",
                ".css" => "Content-Type: text/css; charset=UTF-8\n",
                ".js" => "Content-Type: application/javascript; charset=UTF-8\n",
                ".png" => "Content-Type: image/png\n",
                ".jpg" or ".jpeg" => "Content-Type: image/jpeg\n",
                _ => "Content-Type: application/octet-stream\n"
            };
            resHeader += "\n";
            resBodyBytes = File.ReadAllBytes(fullPath);
        }
        else
        {
            // 文件不存在返回404
            resHeader = "HTTP/1.1 404 Not Found\nServer: my_csharp_server\nContent-Type: text/html; charset=UTF-8\n\n";
            resBodyBytes = Encoding.UTF8.GetBytes("<h1>404 页面不存在</h1>");
        }

        // 发送响应
        byte[] resHeaderBytes = Encoding.ASCII.GetBytes(resHeader);
        client.Send(resHeaderBytes, resHeaderBytes.Length, SocketFlags.None);
        client.Send(resBodyBytes, resBodyBytes.Length, SocketFlags.None);
        client.Close();
    }
}

注意需要额外引入命名空间using System.IO;。

内容的提问来源于stack exchange,提问作者wiz 2021

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:06:04