2009-07-26 12 views
15

Tôi có một lượng lớn dữ liệu (~ 100k) mà ứng dụng C# của tôi đang gửi tới máy chủ Apache của tôi với cài đặt mod_gzip. Tôi đang cố gắng gzip dữ liệu đầu tiên bằng cách sử dụng System.IO.Compression.GZipStream. PHP nhận dữ liệu gzipped thô, vì vậy Apache không giải nén nó như tôi mong đợi. Tui bỏ lỡ điều gì vậy?Gửi dữ liệu gzipped trong WebRequest?

System.Net.WebRequest req = WebRequest.Create(this.Url); 
req.Method = this.Method; // "post" 
req.Timeout = this.Timeout; 
req.ContentType = "application/x-www-form-urlencoded"; 
req.Headers.Add("Content-Encoding: gzip"); 

System.IO.Stream reqStream = req.GetRequestStream(); 

GZipStream gz = new GZipStream(reqStream, CompressionMode.Compress); 

System.IO.StreamWriter sw = new System.IO.StreamWriter(gz, Encoding.ASCII); 
sw.Write(large_amount_of_data); 
sw.Close(); 

gz.Close(); 
reqStream.Close() 


System.Net.WebResponse resp = req.GetResponse(); 
// (handle response...) 

Tôi không hoàn toàn chắc chắn "Content-Encoding: gzip" áp dụng cho tiêu đề do khách hàng cung cấp.

+6

+1 cho mã đăng dữ liệu đã nén. Tôi tin rằng bạn là người duy nhất đã làm như vậy trong toàn bộ thời đại Internet ;-) –

+0

Rất thích nghe nếu bất kỳ ý tưởng nào dưới đây đã giúp bạn - Tôi đang cố gắng giải quyết cùng một vấn đề. –

Trả lời

1

Theo http://www.dominoexperts.com/articles/GZip-servlet-to-gzip-your-pages

Bạn nên setContentType() để định dạng ban đầu, như bạn đang làm với application/x-www-form-urlencoded tôi giả. Sau đó ...

// See if browser can handle gzip 
String encoding=req.getHeader("Accept-Encoding"); 
if (encoding != null && encoding.indexOf("gzip") >=0) { // gzip browser 
     res.setHeader("Content-Encoding","gzip"); 
     OutputStream o=res.getOutputStream(); 
     GZIPOutputStream gz=new GZIPOutputStream(o); 
     gz.write(content.getBytes()); 
     gz.close(); 
     o.close(); 
      } else { // Some old browser -> give them plain text.      PrintWriter o = res.getWriter(); 
        o.println(content); 
        o.flush(); 
        o.close(); 
      } 
4

tôi nhìn vào mã nguồn cho mod_gzip và tôi không thể tìm thấy bất kỳ mã mà decompresses dữ liệu. Rõ ràng mod_gzip chỉ nén dữ liệu gửi đi mà không quá đáng ngạc nhiên sau khi tất cả. Chức năng mà bạn đang tìm kiếm có thể hiếm khi được sử dụng và tôi e rằng bạn phải tự giải nén trên máy chủ.

4

Về câu hỏi của bạn cho dù Content-Encoding là áp dụng đối với tiêu đề client-cung cấp - theo HTTP/1.1 standard, đó là:

(từ phần 7)

Yêu cầu và đáp ứng các thông điệp được chuyển nhượng một thực thể nếu không bị giới hạn bởi phương thức yêu cầu hoặc mã trạng thái phản hồi.

(từ phần 7,1)

entity-header = Allow     ; Section 14.7 
        | Content-Encoding   ; Section 14.11 
        | Content-Language   ; Section 14.12 
        | Content-Length   ; Section 14.13 
        | Content-Location   ; Section 14.14 
        | Content-MD5    ; Section 14.15 
        | Content-Range   ; Section 14.16 
        | Content-Type    ; Section 14.17 
        | Expires     ; Section 14.21 
        | Last-Modified   ; Section 14.29 
        | extension-header 
+5

Điều này đúng, với báo trước rằng hầu hết các máy chủ sẽ không thực hiện giải nén các yêu cầu HTTP, vì khả năng của các cuộc tấn công "Zip Bomb". – EricLaw

2

Bạn cần thay đổi

req.Headers.Add("Content-Encoding: gzip"); 

để

req.Headers.Add("Content-Encoding","gzip"); 
0

Trên PHP bên này sẽ tách đầu trang và chân trang khỏi tệp

function gzip_stream_uncompress($data) { return gzinflate(substr($data, 10, -8)); }