2017-10-24 26 views
1

HTML/CSS/JS에 사용자 정의 테마가 포함 된 HTTP File Server 인 응용 프로그램을 작성하고 있습니다. 대부분의 다운로드 관리자가 서버에 연결하기 때문에 여러 부분으로 파일을 제공하고 싶습니다. 여러 연결을 사용하여 파일을 8 조각으로 다운로드하면 다운로드 속도가 향상되고 다운로드가 다시 시작되고 일시 중지 될 수 있습니다.C# HttpListener 부분 콘텐츠

HTTP's Partial Content이 가능하다는 것을 알고있는 한 웹을 둘러 보았지만 HttpListener을 웹 페이지 및 파일을 제공하는 코드에서 구현하는 방법에 대한 좋은 예는 찾을 수 없었습니다.

누군가가 TcpListener을 사용하겠다고 제안했지만 내 전체 앱이 HttpListener에서 작동하므로 전환을 위해 TcpListener을 사용하여 부분 콘텐츠 검색의 좋은 예를 찾지 못했습니다.

웹 서버는 멀티 스레드이며 서로 다른 연결을 통해 많은 요청을 동시에 처리하는 데 문제가 없습니다. 하지만 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에서 어떻게 작동합니까?

유용한 링크와 정보를 제공해 주시면 감사하겠습니다.

답변

0

면책 조항 :이 답변은 완전하지 않은 것으로 보아,이 맥락에서 많은 이야기를해야 할 것입니다. 그러나 시작으로 ...

당신이 사용하는 청취자는 그것에 아무런 관련이 없습니다. 귀하의 코드는 RANGE HTTP 헤더를 알고 있어야합니다. RANGE이 제공되면이 헤더 + 전송 206에 지정된대로 파일을 읽고 제공하십시오. 그렇지 않으면 전체 파일을 제공하고 200을 보냅니다.

이것은 버퍼 오프셋이 아니라 파일 오프셋입니다.

첫 번째 응답 코드 및 기타 메타 데이터 (헤더)를 설정하고 마지막 단계로 스트림에 씁니다.

그러면 파일을 실제로 제공하는 방식을 완전히 변경해야 할 것입니다. 예를 들어 FileStream에서 CopyToAsync()를 호출합니다.

그리고 이 아니며, MIME입니다.

+0

정보를 보내 주셔서 감사합니다. 최대한 빨리 전체 피드백을 게시하고 예를 들어 MIME이라고 알고 있습니다. 때로는 메소드와 vars에 재미있는 이름을 사용합니다. :)) –