8

一連の Web サイトを既存の IIS5 サーバーから新しい IIS7 Web サーバーに移行しています。ページの 1 つは、データベース内の BLOB からデータ ファイルをプルし、それをエンド ユーザーに提供します。

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

新しい IIS7 インストールでこれをテストすると、Internet Explorer と Firefox の両方で「接続のリセット」エラーが発生します。Content-Length ヘッダーが削除されている場合、ドキュメントは正しく提供されます (ただし、ユーザーは有用な進行状況バーを取得できません)。

これを修正する方法についてのアイデア; サーバー構成オプションかコード経由か?

編集1:もう少し試行錯誤しました。「Enable Buffering」と「Enable Chunked Encoding」の両方が false の場合、リクエストは成功します。どちらかが有効になっていると、エラーが発生します。

編集 2:さらなる試行錯誤のテスト。テキスト ファイルはスクリプトで正常に動作することがわかりました。バイナリ ファイル (画像、PDF など) のみが失敗します。そうでなければ、まだ完全に無知です。

4

3 に答える 3

9

すでにどこかで述べたように: http://en.wikipedia.org/wiki/Chunked_transfer_encoding

プロトコルが必要とする Content-Length ヘッダーの代わりに、 Transfer-Encoding HTTP 応答ヘッダーを使用します。Content-Lengthヘッダーが使用されないため、サーバーは、クライアント (通常は Web ブラウザー) への応答の送信を開始する前に、コンテンツの長さを知る必要はありません。Web サーバーは、コンテンツの合計サイズを知る前に、動的に生成されたコンテンツを含む応答の送信を開始できます。

IIS7 では、これはデフォルトで有効になっています: http://technet.microsoft.com/en-us/library/cc730855(v=ws.10).aspx

World Wide Web パブリッシング サービスの HTTP 1.1 チャンク転送エンコーディングを有効にするには、次の構文を使用します。

appcmd set config /section:asp /enableChunkedEncoding:True|False

True は HTTP 1.1 チャンク転送エンコーディングを有効にし、False は HTTP 1.1 チャンク転送エンコーディングを無効にします。デフォルト値は True です。

同じ問題がありました。解決策: AddHeader "Content-Length" を削除します。

于 2012-03-21T09:40:36.213 に答える
2

それを機能させるには、次の 2 つのオプションがあります。

  1. 「Content-Length」の代わりに「Content-Size」ヘッダーを出力します。すべてのクライアントがそれを認識するわけではありませんが、少なくとも機能することに注意してください。

  2. (推奨) Response.Buffer を True に設定すると、"Content-Length" ヘッダーを使用して、自分で "チャンク" を処理できます (したがって、ASP メモリ バッファーに負担をかけません)。

以下はIIS7で機能し、ファイルサイズ情報をブラウザに正しく送信しているようです。

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
于 2013-04-26T04:37:18.597 に答える