【发布时间】:2019-10-01 13:49:00
【问题描述】:
我目前面临的问题是,我无法让我的 C# 程序编写我想在响应中发送的文件(我正在编写文件的字节)并且有一个有效的 HTTP 响应,如果我已将文件附加到响应中,我正在测试它的浏览器会说 ERR_INVALID_HTTP_RESPONSE。
最初我使用的是 HttpListener,但这要求我每次都以管理员身份运行我的 IDE,所以我决定放弃它并开始使用 TcpListener。
这只是一个完全使用 C# 运行并使用来自 System.Net 的 TcpListener 的简单 Web 服务器。到目前为止,我已经尝试使用StreamWriter 中的BaseStream 将文件的字节写入响应中。
我一直在四处寻找通过 TCP/HTTP 发送文件的其他方法,但似乎有两件事很明显,它没有很好地记录如何正确执行此操作,而且似乎没有人为此提出相同的问题具体场景。
到目前为止,处理传入连接响应的代码如下。
StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());
string request = sr.ReadLine();
if (request != null) {
//byte[] testData = Encoding.UTF8.GetBytes("Test");
string[] tokens = request.Split(" ");
try {
FileInfo file = files[tokens[1]];
byte[] fileBytes = File.ReadAllBytes(file.FullName);
sw.WriteLine("HTTP/1.0 200 OK\n");
sw.BaseStream.Write(fileBytes, 0, fileBytes.Length);
sw.Flush();
} catch {
sw.WriteLine("HTTP/1.0 404 OK\n");
sw.Write("<h1>Error 404</h1><p>The file you were looking for does not exist</p>");
sw.Flush();
}
}
client.Close();
预期结果是浏览器将显示图像,就像您在 imgur 链接中看到的一样,与我用来显示当前结果的屏幕截图的格式基本相同,即预期结果。
【问题讨论】:
-
404 OK?!?!好像有点不对劲。 -
可能是这样,但是当我测试尝试打开一个不存在的文件时它工作得很好
-
好吧,浏览器只看
404部分;OK更适合人类。但从技术上讲,404应该是Not Found。 -
您从 HTTP 侦听器切换到 TCP 侦听器的“因为它需要管理员权限”的原因不足以实现您自己的网络服务器。除非您想花几天时间实现 http 标准请求和响应,否则最好坚持使用 http 侦听器。更容易解决的是管理员权限和 http 监听器的问题:stackoverflow.com/questions/4019466/httplistener-access-denied
-
这取决于@Harry 的意见。我实际上只需要一个功能,它不会花费我几天的时间来实现标准的请求和响应,因为它们根本不需要我使用它。
标签: c# tcplistener