2011-09-15 32 views
5

Tôi sử dụng HttpListener cho máy chủ http của riêng mình (Tôi không sử dụng IIS). Tôi muốn để nén OutputStream của tôi bằng cách Gzip nén:C# HttpListener Response + GZipStream

byte[] refBuffer = Encoding.UTF8.GetBytes(...some data source...); 

var varByteStream = new MemoryStream(refBuffer); 

System.IO.Compression.GZipStream refGZipStream = new GZipStream(varByteStream, CompressionMode.Compress, false); 

refGZipStream.BaseStream.CopyTo(refHttpListenerContext.Response.OutputStream); 

refHttpListenerContext.Response.AddHeader("Content-Encoding", "gzip"); 

Nhưng tôi nhận được lỗi trong Chrome:

ERR_CONTENT_DECODING_FAILED

Nếu tôi loại bỏ AddHeader, sau đó nó hoạt động, nhưng kích thước của phản ứng dường như không bị nén. Tôi đang làm gì sai?

+0

Không thể nén nội dung nào đó do tiêu đề, vì bạn đang viết nội dung rõ ràng như được nén. Bạn có chắc Chrome không chỉ cung cấp cho bạn kích thước * giải nén * của tệp không? – Ryan

+0

@minitech, câu hỏi hay !!! Tôi đang cố kiểm tra kích thước lưu lượng truy cập thực tế. – Edward83

Trả lời

9

Sự cố là quá trình chuyển của bạn đang đi sai hướng. Những gì bạn muốn làm là gắn GZipStream đến Response.OutputStream và sau đó gọi CopyTo trên MemoryStream, đi qua trong GZipStream, như vậy:

refHttpListenerContext.Response.AddHeader("Content-Encoding", "gzip"); 

byte[] refBuffer = Encoding.UTF8.GetBytes(...some data source...); 

var varByteStream = new MemoryStream(refBuffer); 

System.IO.Compression.GZipStream refGZipStream = new GZipStream(refHttpListenerContext.Response.OutputStream, CompressionMode.Compress, false); 

varByteStream.CopyTo(refGZipStream); 
refGZipStream.Flush(); 
4

Vấn đề đầu tiên (như đã đề cập bởi Brent M Spell) là vị trí sai của tiêu đề. Thứ hai là bạn không sử dụng đúng GZipStream. Luồng này yêu cầu luồng "trên cùng" để ghi vào, nghĩa là luồng trống (bạn điền vào nó bằng bộ đệm của mình). Có một dòng "trên cùng" trống thì tất cả những gì bạn phải làm là viết trên bộ đệm của GZipStream. Kết quả là luồng bộ nhớ sẽ được lấp đầy bởi nội dung nén. Vì vậy, bạn cần một cái gì đó như:

byte[] buffer = ....; 

using (var ms = new MemoryStream()) 
{ 
    using (var zip = new GZipStream(ms, CompressionMode.Compress, true)) 
    zip.Write(buffer, 0, buffer.Length); 
    buffer = ms.ToArray(); 
} 

response.AddHeader("Content-Encoding", "gzip"); 
response.ContentLength64 = buffer.Length; 

response.OutputStream.Write(buffer, 0, buffer.Length); 
Các vấn đề liên quan