[英]C# HttpListener Partial Content
我正在編寫類似於HFS
的應用程序,這是一個具有HTML/CSS/JS
自定義主題的HTTP File Server
,並且我希望能夠分多個部分提供文件服務,因為大多數下載管理器都通過多個連接到服務器連接並下載文件為8
件,該功能最終提高了下載速度,並使下載具有恢復和暫停的功能。
據我所知, HTTP's Partial Content
使這一切成為可能,我環顧了整個網絡,但是找不到任何在我使用HttpListener
來提供網頁和文件的代碼中實現該代碼的好例子。
我見過某處有人建議改用TcpListener
但由於我的整個應用程序都在HttpListener
,因此還沒有真正找到任何使用TcpListener
切換部分內容的好例子。
Web服務器是多線程的,通過不同的連接同時處理許多請求沒有任何問題。 但是,每當我使用IDM
下載大文件時,它都會通過單個連接提供內容,而IDM顯示服務器無法提供"206"
( HTTP Partial Content
)
這是我當前用於提供文件的代碼:
context.Response.ContentType = GetMeme(filename);
Stream input = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
context.Response.ContentLength64 = input.Length;
byte[] buffer = new byte[1024 * 16];
int nbytes;
while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0)
context.Response.OutputStream.Write(buffer, 0, nbytes);
input.Close();
context.Response.StatusCode = (int)HttpStatusCode.OK;
context.Response.OutputStream.Flush();
context.Response.OutputStream.Close();
我試圖從HTTP頭獲取緩沖區偏移量,但由於偏移量,它無法關閉流,並說Cannot close stream until all bytes are written.
還有更好的選擇嗎? 甚至HttpListener都可以正確處理HTTP:206嗎? TcpListener上的部分內容如何工作?
任何有用的鏈接和信息將不勝感激。
免責聲明:這個答案並不假裝是完整的,在這種情況下,有太多事情要討論。 但是作為開始...
您使用的偵聽器與此無關。 您的代碼應注意RANGE
HTTP標頭。 提供RANGE
,按照此標頭中的指定讀取並提供文件+發送206。否則,提供整個文件並發送200。
它不是您獲得的緩沖區偏移量,而是文件偏移量。
首先設置響應代碼和其他元數據(標題),並作為最后一步寫入流。
而且,您可能必須完全改變實際提供文件的方式。 例如,在您擁有的FileStream上調用CopyToAsync()。
它不是Meme
,而是MIME
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.