簡體   English   中英

C#如何通過TCP為HTTP發送文件?

[英]C# How do you send a file via TCP for HTTP?

我目前面臨的問題是,我無法讓我的C#程序在響應中編寫我想要發送的文件(我正在寫文件的字節)並且有一個有效的HTTP響應,瀏覽器我如果我已經將文件附加到響應中,那么測試它就是說ERR_INVALID_HTTP_RESPONSE

最初我使用的是HttpListener,但這要求我每次都以管理員身份運行我的IDE,所以我決定放棄它並開始使用TcpListener

這只是一個完全由C#運行的簡單Web服務器,它利用System.NetTcpListener 到目前為止,我已嘗試使用StreamWriterBaseStream將文件的字節寫入響應。

我一直在尋找其他方法通過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鏈接中看到的那樣,基本上與我用於顯示當前結果的屏幕截圖的格式相同的格式是預期結果。

圖片來自https://i.imgur.com/pxONnIP.png

HTTP規定初始行和標題應以CRLF而不是 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);

我也避免使用WriteLine因為不保證所有平台的行結尾都是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM