出来るのだASP Q&A掲示板(過去LOG)  訪問数 52046 昨日 889 今日 776
    【PR】 パソコン入門からIT専門書まで幅広く取り揃えています。セブン-イレブン受取り手数料無料のセブンアンドワイ。
Topに戻る 掲示板に戻る 検索 削除 管理者

Response.Redirect   ハシモトさん [2001/12/12 10:50:46] [1235]
  発言者により削除されました!! 北岳さん [2001/12/12 11:54:56] [1239]
    発言者により削除されました!! 北岳さん [2001/12/12 12:16:15] [1243]
    発言者により削除されました!! 北岳さん [2001/12/12 12:19:32] [1244]
    Re:   ハシモトさん [2001/12/12 12:50:54] [1245]
    Re:【HTTP ヘッダーはすでにクライアントのブラウザに書き込まれています。】   ハシモトさん [2001/12/12 12:51:12] [1246]
  【HTTP ヘッダーはすでにクライアントのブラウザに書き込まれています。】   北岳さん [2001/12/12 12:59:49] [1247]
    再訂正   北岳さん [2001/12/15 11:42:41] [1265]

[1235] Response.Redirect
投稿者:ハシモトさん 2001/12/12 10:50:46
Response.Redirect"〜.asp"
を使っていたら
HTTP ヘッダーはすでにクライアントのブラウザに書き込まれています。
HTTP ヘッダーの修正はページ内容を書き込む前に行われなければなりません。
というエラーメッセージが出てしまいました。
Response.Redirectを使うにはどうすればよいのでしょうか?

[1239] 【HTTP ヘッダーはすでにクライアントのブラウザに書き込まれています。】
投稿者:北岳さん 2001/12/12 11:54:56
発言者により削除されました!!

[1243] Re:【HTTP ヘッダーはすでにクライアントのブラウザに書き込まれています。】
投稿者:北岳さん 2001/12/12 12:16:15
発言者により削除されました!!

[1244] 補足訂正
投稿者:北岳さん 2001/12/12 12:19:32
発言者により削除されました!!

[1245] Re:
投稿者:ハシモトさん 2001/12/12 12:50:54
こんにちはハシモトです。
貴重な情報ありがとうございます。
北岳さんどうもありがとうございました!

[1246] Re:【HTTP ヘッダーはすでにクライアントのブラウザに書き込まれています。】
投稿者:ハシモトさん 2001/12/12 12:51:12
> 【理屈】 
> ■aspは、サーバのメモリの中で(スクリプトを使って一時的に)作成した文字列を、中身はHTML文書と同じ形式で、クライアントに送り返します。
>  
> ■次のスクリプトならエラーは出ません。
> ---------"/alias/1.asp"----------
> <% if request.form("x")="A" then %>
> <html><body>
> <p>xの値は</p>
> <p>Aです。</p>
> </body></html>
> <% elseif request.form("x")="B" then %>
> <html><body>
> <p>xの値は</p>
> <p>Bです。</p></body></html>
> <% else %>
> response.redirect "/alias/9.asp"
> <% end if %>
> -------------------
>  
> この場合、サーバは、
> request.form("x")が"A"なら、HTML文書と同じ形式の文字列
> 『<html><body><p>xの値は</p><p>Aです。</p></body></html>』
> だけを、クライアントに送ります。
>  
> request.form("x")が"B"なら、HTML文書と同じ形式の文字列
> 『<html><body><p>xの値は</p><p>Bです。</p></body></html>』
> だけを、クライアントに送ります。
>  
> request.form("x")が"A"でも"B"でもなければ、
> "/alias/9.asp"
> に移動します。
>  
>  
> ■次のスクリプトは、response.redirectを実行しようとすると、エラーが出ます。
> ---------"/alias/2.asp"----------
> <html><body>
> <p>xの値は</p>
> <% if request.form("x")="A" then %>
> <p>Aです。</p>
> </body></html>
> <% elseif request.form("x")="B" then %>
> <p>Bです。</p>
> </body></html>
> <% else %>
> response.redirect "/alias/9.asp"
> <% end if %>
> -------------------
>  
> この場合、サーバは、最初に(if が始まる前に)
> 『<html><body><p>xの値は</p>』
> という文字列をクライアントに送っています。
>  
> 次にrequest.form("x")が"A"または"B"なら
> 『<p>A(または、B)です。</p></body></html>』
> を送り、(response.redirect "/alias/9.asp" へは差し掛からないから)無事終了します。
>  
> ■ところが、"A"でも"B"でもなければ、"/alias/9.asp"に行こうとするのですが、
> では既にブラウザに送ってしまった
> 『<html><body><p>xの値は</p>』
> の文字列は、どう始末をつければ良いのか、という問題が発生します。
>  
> ブラウザ画面には、「xの値は」が表示された、と思った途端に全く別の9.aspの画面に変わる?
> 多分そういう仕組も可能だったのでしょうが、マイクロソフト社(?)は、無駄な文字列がWEB交通を混雑させるのを嫌ったのでしょう。 
> ブラウザに何か表示させるものを送ってしまった後は、response.redirectできないようにしました。
> ヘッダーとは、『<html><head>〜</head>』の部分です。
> 『<html>』の1語だけでもブラウザに送ったら、response.redirectは不可、としました。
>  
> これは仕様です。
>  
> ==================================================
> 【対策】
> "/alias/2.asp"のように
> 『<html>〜』の後に『response.redirect』が来る
> ような書き方をしないで、
> "/alias/1.asp"のように、
> 『response.redirect』の前では、HTML文のたとえ一部でも、一切書かない
> ように工夫を要することになります。

[1247] 【HTTP ヘッダーはすでにクライアントのブラウザに書き込まれています。】
投稿者:北岳さん 2001/12/12 12:59:49
(訂正では判りづらいので、全部書き換えます。)

【理屈】 
■aspは、サーバのメモリの中で(スクリプトを使って一時的に)作成した文字列を、中身はHTML文書と同じ形式で、クライアントに送り返します。
 
■次のスクリプトならエラーは出ません。
---------"/alias/1.asp"----------
<% if request.form("x")="A" then %>
<html><body>
<p>xの値は</p>
<p>Aです。</p>
</body></html>
<% elseif request.form("x")="B" then %>
<html><body>
<p>xの値は</p>
<p>Bです。</p></body></html>
<% else %>
response.redirect "/alias/9.asp"
<% end if %>
-------------------
 
この場合、サーバは、
request.form("x")が"A"なら、HTML文書と同じ形式の文字列
『<html><body><p>xの値は</p><p>Aです。</p></body></html>』
だけを、クライアントに送ります。
 
request.form("x")が"B"なら、HTML文書と同じ形式の文字列
『<html><body><p>xの値は</p><p>Bです。</p></body></html>』
だけを、クライアントに送ります。
 
request.form("x")が"A"でも"B"でもなければ、
"/alias/9.asp"
に移動します。
 
 
■次のスクリプトは、response.redirectを実行しようとすると、エラーが出ます。
---------"/alias/2.asp"----------
<html><body>
<p>xの値は</p>
<% if request.form("x")="A" then %>
<p>Aです。</p>
</body></html>
<% elseif request.form("x")="B" then %>
<p>Bです。</p>
</body></html>
<% else %>
response.redirect "/alias/9.asp"
<% end if %>
-------------------
 
この場合、サーバがクライアントに向けて送り出す文字列は、まず
 『<html><body><p>xの値は</p>』
までを確定します。
 
次にrequest.form("x")が"A"または"B"なら
 『<p>A(または、B)です。</p></body></html>』
を付け加え、(response.redirect へは差し掛からないから)
全体を送り出して、無事終了します。
 
■ところが、"A"でも"B"でもなければ、"/alias/9.asp"に行こうとするのですが、
既にブラウザに向けて送ることを確定させた文字列と組み合わせて、
 『<html><body><p>xの値は</p>
  <% response.redirect "/alias/9.asp" %>』
という構成になっています。
 
クライアントに送れ(このままブラウザに表示せよ)、と言う指示(前半)と、
別の場所に移れ、という指示(後半)が、両方書かれていますので、ASPは
「俺はいったい、どっちへ行きゃぁいいんだよ」と怒り出します。
 
MS社は、ブラウザに表示させるものを何か送ってしまった後は、response.redirectできないようにしました。
ヘッダーとは、『<html><head>〜</head>』の部分です。
『<html>』の1語だけでもブラウザに送ったら、response.redirectは不可、としました。
 
これは仕様です。
 
==================================================
【対策】
"/alias/2.asp"のように
『<html>〜』の後に『response.redirect』が来る
ような書き方をしないで、
"/alias/1.asp"のように、
『response.redirect』の前では、HTML文のたとえ一部でも、一切書かない
ように工夫を要することになります。

[1265] 再訂正
投稿者:北岳さん 2001/12/15 11:42:41
HTTPヘッダーを送り出したあとResponse.Redirectはできなくなる件、
最初の理屈(甲:逐次クライアントに送信)が正しく、
訂正後の理屈(乙:メモリ=バッファ=にまとめてから送信)は特殊の場合でしたので、
再訂正し(元に戻し)ます。
 
なお、IISで
中身がHTML形式のASP文字列を、例え1語でもクライアントに送ったら、
引き続きResponse.Redirectで別asp(別場所)に移ることを、MS社は仕様で禁止。
ここは不変です。
 
----<1>------
(甲)山田祥寛氏「標準ASPテクニカルリファレンス」p.59によれば
「IIS/PWSは(略)出力は逐次クライアントに送信されます。」
とありました。
 
(乙)ASP1行目に response.buffer=true を書いておくと、
サーバは送り出す文字列をバッファに溜めておいて、
・頁処理が完全に終了、または
・Response.Flush や Response.Endが実行されたときに、
まとめて送り出します。
 
以下蛇足です。
-----<2>----
(「イラストで読むイントラネット入門」1997.7インプレス、から解釈)
送り出される内容は、頭にTCPヘッダ、IPヘッダ(送り元、送り先のIPアドレスなど)が付けられ、
画像などでデータ量が許容値を超えるときは、複数のパケットに分割されてから送り出されます。
 
例えば地球の裏から複数のパケット(小包)が、
一方は太平洋をくぐり(ホント)、別のはエベレスト山頂を越えて(ウソ)、
時刻を違えて我が家のパソコンに届きます。
各パケットには同一の宛名・差出人名と、小包の順番が表示されているので、
解包されて、番号順に組立し直されてから、画面に表示されます。
(インタネットへ接続では、コンパネの、ネットワークの設定のって、ややこしいことをやらされましたが・・・
へえ、ウチのパソコンって、小包の整理もやってんだ。)
 
---------------
なんか<1>と<2>は仕組が調和しない感じです。
あるWWWサーバが、(甲のケースで)asp逐次送り出し途中に思い切り重い処理を入れたら、誰か困らないですか?
推定では次のサーバだけが、無駄に回線ビジーになって、困るんでしょうね。
そこで時間的な間延びは解消されるのでしょう・・・
が、私らユーザには、どうでもよいお話でした。



TreeBBS For ASP V.0.1.3
Program By YasNet