2010-06-14 27 views
6

Tôi đang di chuyển một loạt trang web từ máy chủ IIS5 hiện có sang máy chủ web IIS7 hoàn toàn mới. Một trong những trang kéo một tập tin dữ liệu từ một blob trong cơ sở dữ liệu và phục vụ nó cho người dùng cuối:IIS7 - Chỉ định tiêu đề nội dung độ dài trong ASP gây ra lỗi "kết nối lại"

Response.ContentType = rs("contentType") 
Response.AddHeader "Content-Disposition", "attachment;filename=" & Trim(rs("docName"))&rs("suffix")' let the browser know the file name 
Response.AddHeader "Content-Length", cstr(rs("docsize"))' let the browser know the file size 

kiểm tra này trong IIS7 mới cài đặt, tôi nhận được một kết nối "Reset" lỗi trong cả hai trình duyệt Internet Explorer và Firefox. Tài liệu được phân phối chính xác nếu tiêu đề Content-Length bị xóa (nhưng sau đó người dùng sẽ không nhận được thanh tiến trình hữu ích).

Bất kỳ ý tưởng nào về cách sửa lỗi này; cho dù đó là tùy chọn cấu hình máy chủ hay thông qua mã?

Chỉnh sửa 1: Đã thử thêm một chút và lỗi. Các yêu cầu sẽ thành công nếu cả "Enable Buffering" và "Enable Chunked Encoding" đều sai. Nếu một trong hai được kích hoạt, lỗi xảy ra.

Chỉnh sửa 2: Thử nghiệm và thử nghiệm lỗi khác; chỉ ra rằng các tập tin văn bản sẽ làm việc tốt với kịch bản; chỉ các tệp nhị phân (hình ảnh, pdf, v.v.) sẽ không thành công. Vẫn hoàn toàn thất bại nếu không.

Trả lời

7

Như đã đề cập ở một nơi khác: http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Nó sử dụng Transfer-Encoding đáp ứng tiêu đề HTTP ở vị trí của tiêu đề Content-Length, mà giao thức sẽ có yêu cầu khác. Vì tiêu đề Nội dung dài không được sử dụng, máy chủ không cần biết độ dài của nội dung trước khi bắt đầu truyền phản hồi cho ứng dụng (thường là trình duyệt web). Máy chủ web có thể bắt đầu truyền phản hồi bằng nội dung được tạo động trước khi biết tổng kích thước của nội dung đó.

Trong IIS7 này được kích hoạt theo mặc định: http://technet.microsoft.com/en-us/library/cc730855(v=ws.10).aspx

Để kích hoạt HTTP 1.1 chunked mã hóa chuyển giao cho Wide dịch vụ Thế giới Web xuất bản, sử dụng cú pháp sau:

APPCMD thiết config/phần : asp/enableChunkedEncoding: True | False

True bật mã hóa chuyển HTTP chunked 1.1 trong khi False disables Mã hóa chuyển HTTP chunked 1.1. Giá trị mặc định là true.

Chúng tôi đã có cùng một vấn đề, giải pháp của chúng tôi: loại bỏ AddHeader "Content-Length"

+0

Sau khi di chuyển từ XP Pro sang Server 2008 R2, lỗi xảy ra. Tôi đã phải loại bỏ tiêu đề Content-Length để giải quyết vấn đề. – linquize

+2

Cùng một vấn đề và giải pháp ở đây. Đối với những gì nó có giá trị, bạn có thể thay đổi "Content-Length" thành "Content-Size" và nó sẽ làm việc, mặc dù khách hàng có thể không nhận ra rằng (bây giờ không được chấp nhận) tiêu đề. –

1

Có hai lựa chọn để làm cho nó làm việc:

  1. Output "Nội dung-Kích thước" tiêu đề , thay vì "Content-Length". Lưu ý không phải tất cả khách hàng sẽ nhận ra điều đó, nhưng ít nhất nó hoạt động.

  2. (ưu tiên) Set Response.Buffer thành True thì bạn có thể sử dụng "Content-Length" header, và xử lý các "chunking" cho mình (do đó không đánh thuế các bộ nhớ đệm ASP):

Các công trình sau đây dành cho tôi trên IIS7 và dường như gửi thông tin kích thước tệp chính xác đến trình duyệt.

Response.Buffer = True 
Response.ContentType = "application/pdf" 
Response.AddHeader "Content-Disposition", "attachment; filename=""yourfile.pdf""" 

Set objStream = Server.CreateObject("ADODB.Stream") 
objStream.Open 
objStream.Type = adTypeBinary 
objStream.LoadFromFile "yourfile.pdf" 

Response.AddHeader "Content-Length", objStream.Size 

' Send file in chunks. ' 
lByteCount = 0 
lChunkSize = 100000 
While lByteCount < objStream.Size 
    If lByteCount + lChunkSize > objStream.Size Then lChunkSize = objStream.Size - lByteCount 
    Response.BinaryWrite objStream.Read(lChunkSize) 
    Response.Flush ' Flush the buffer every 100KBytes ' 
    lByteCount = lByteCount + lChunkSize 
Wend 

objStream.Close 
Set objStream = Nothing 
1

Gặp phải vấn đề tương tự khi di chuyển mã ASP từ máy chủ Windows 2003 sang Windows 2012 với IIS 8.5. Việc sửa chữa được điều chỉnh mã ASP như sau:

Từ:

Response.AddHeader "Content-Length", Kích

Để:

Response.AddHeader "Content-Kích thước", Kích thước

Các vấn đề liên quan