如何指定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. 实现真正的静态文件服务
你当前的写法只是把路径字符串直接返回给请求端,并没有实现读取指定根目录下对应文件的功能,要完成需求还要补充以下逻辑:
- 解析HTTP请求头,提取请求的资源路径
- 将请求路径和你配置的根目录拼接得到本地文件路径
- 判断文件是否存在,存在则读取文件内容作为响应体返回,不存在则返回404状态码
- 根据文件后缀设置对应的
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
相关产品推荐
相关产品推荐

