我当前面临的问题是我无法使C#程序编写要在响应中发送的文件(我正在写文件的字节),并且没有有效的HTTP响应,即浏览器ERR_INVALID_HTTP_RESPONSE我正在测试是否表示我已将文件附加到响应中。
最初我使用的是HttpListener,但这要求我每次都以admin身份运行IDE,所以我决定离开它并开始使用TcpListener。
这只是一个简单的Web服务器,完全使用C#运行,并利用TcpListenerfrom System.Net。到目前为止,我已经尝试使用BaseStreamfrom StreamWriter将该文件的字节写入响应中。
我一直在寻找其他通过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();
Run Code Online (Sandbox Code Playgroud)
预期的结果是浏览器将显示图像,就像您从imgur链接中看到的那样,基本上与我用来显示当前结果的屏幕快照的格式相同,是预期的结果。
HTTP指示初始行和标头应以CRLF(not LF)结尾,并且双精度CRLF应将初始行和标头与响应正文分开。
这是HTTP协议的超级实用指南:
https://www.jmarshall.com/easy/http/
StreamWriter从切换StreamWriter到基本流操作之前,您可能还需要刷新您的代码。
sw.Write("HTTP/1.0 200 OK\r\n\r\n");
sw.Flush(); // <-- HERE
sw.BaseStream.Write(fileBytes, 0, fileBytes.Length);
Run Code Online (Sandbox Code Playgroud)
我也要避免,WriteLine因为不能保证所有平台的行尾都相同。
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |