Response.Redirectで、別ASPに飛びません。
[上に]
[前に]
[次に]
じゅん
1999/12/08(水) 11:24:33
ログイン画面で入力した、社員コード、パスワードを、別ASPでチェックしています。
ログインチェックASPで、ADOのエラー時に、ログイン画面へResponse.Redirectで
飛ばしたいのですが、そのまま処理が流れてしまいます。
以下、ログインチェック.aspのプログラム
<%
・
・
On Error Resume Next
Err.Clear 'Errオブジェクトのクリア
Set LcObjConn = server.CreateObject("ADODB.Connection")
LcObjConn.Open("ODBC")
If Err.Number <> 0 Then
'エラー情報をSessionオブジェクトに設定(ログイン画面に表示する)
LcObjConn.Close
Set LcObjConn = Nothing
Call SbErrorProc("エラーです")
End If
・
・
・
Sub SbErrorProc(LcStrMsg)
'エラー情報をSessionオブジェクトに設定(ログイン画面に表示する)
Session("SeMsg") = LcStrMsg
Session("SeErrMsg") = "詳細情報:" & Err.description & "(" & Err.number & ")"
Response.Redirect "ログイン.asp"
End Sub
%>
具体的な現象は、ODBCのオープンエラーが発生した場合、Err.Numberが0以外になるので、
SbErrorProcを呼びます。
SbErrorProcの中では、Sessionオブジェクトにエラー情報を設定します。
本来ならば、ログイン.aspにリダイレクトして、エラー情報を表示すると思ったのですが、ログイン.aspに
リダイレクトせず、ログインチェック.aspの処理を続行しています。
Response.Redirectの後に、Response.Endを追加してみましたが、ダメでした。
記述に間違いがあるのでしょうか?
また、Response.Redirectを使用する場合、注意点はありますか?
開発環境は、NT4.0SP4 + IIS4.0 + VBScript です。
よろしくお願いします。
うぐいす
1999/12/08(水) 12:07:14
特に間違っているように感じませんので確認です。
>If Err.Number <> 0 Then
Err.Numberには、ちゃんと0以外の値が入ってますか?
Err.Raiseを使えば、強制的にエラーを発生させることが出来ます。
>Response.Redirect "ログイン.asp"
ファイル名は半角英数字のほうが良いと思います。
説明のために2バイト文字にされているのでしたら、すみません。
>NT4.0SP4 + IIS4.0 + VBScript
私の開発環境も同じですが、Response.Redirectは実行されています。
通りすがりの若輩もの
1999/12/08(水) 12:36:30
こんちわ。
サブルーチンをコールして、サブルーチン内でRedirectしているのが、
キモかもしれません。
サブールーチンを止めて直接記述してみてどうなるか、試してみては
いかがでしょうか。
ちなみに、ただ単にRedirectすることは出来ているのですよね。
一般によくやるミスは、すでに何らかの情報をクライアントを渡した後
でRedirectしようとしてエラーが出る事ですが、この点に関しては、
大丈夫でしょうか。
あの、ちなみに後学のために教えて欲しいのですが、
>Set LcObjConn = server.CreateObject("ADODB.Connection")
>LcObjConn.Open("ODBC")
この部分のエラーをトラップする目的とは、何なのでしょう?
どういう要因でエラーが発生すると想定されているのですか?
じゅん
1999/12/08(水) 13:53:53
うぐいすさん、通りすがりの若輩ものさん、早速のレスありがとうございました。
頂いたアドバイスを試してみました。
>Err.Numberには、ちゃんと0以外の値が入ってますか?
Err.Numberは、0以外が入っていました。
>ファイル名は半角英数字のほうが良いと思います。
半角英数字にしてみましたが、ダメでした。
>サブールーチンを止めて直接記述してみてどうなるか、試してみては
>いかがでしょうか。
お〜、動きました。
そうすると、サブルーチン内でのResponse.Redirectが原因なんでしょうか?
エラー処理を共通化したかったので、サブルーチンにしたのですが、直接、記述することにします。
これって、VBScriptの仕様ですかね。(^^;
それとも、スクリプトエンジンのバージョンをアップすると直るとか。
忘れましたが、NT WorkStationのPWSで、IE4.0sp1の環境です。
あの、うぐいすさんにお願いしたことがあります。
うぐいすさんの環境で、サブルーチンをコールして、サブルーチン内でのResponse.Redirectは動くか確認できますか?
通りすがりの若輩ものさんに、お聞きしたことがあります。
>一般によくやるミスは、すでに何らかの情報をクライアントを渡した後
>でRedirectしようとしてエラーが出る事ですが、この点に関しては、
>大丈夫でしょうか。
というのは、具体的にどのような処理のことですか?
再質問して申し訳ありませんが、よろしくお願いします。
>この部分のエラーをトラップする目的とは、何なのでしょう?
>どういう要因でエラーが発生すると想定されているのですか?
の件ですが、ODBCのデータソース名の変更し忘れや、ODBCを間違って削除した場合を想定して付けました。
実際の運用では、皆無に等しいエラーかもしれません。
一応、念のために付けてみました。(^^;
でも、良く考えると、ここに、エラートラップがなくてもコネクションが無いので、
それ以降のADO関連の処理でエラーとなるため、必要ないかもしれませんね。
うぐいす
1999/12/08(水) 15:13:46
>うぐいすさんの環境で、サブルーチンをコールして、サブルーチン内でのResponse.Redirectは動くか確認できますか?
すでにあるソースを使いましたので、CreateObjectは使用していないのですが、
<%
if errflg <> 0 then
call aaa()
end if
sub aaa()
response.redirect "input.html"
end sub
%>
としてみたところ、正常に動いております。
サブルーチン化してもresponse.redirectには影響がないようです。
通りすがりの若輩もの
1999/12/08(水) 16:44:25
私も気になって試しましたが、うぐいすさんのおっしゃる通り、
サブルーチン内でResponse.Redirectしても何ら問題無く動作してしま
いました。
サブルーチン内でも、Redirect先が無いとか、後述のヘッダー情報書き
込み後のRedirectも試しましたが、ブラウザで正しくエラーが表示され
ているので、もっと根本的なところで勘違いされているのかも知れま
せん。ロジック処理フローでの勘違いとか。^^;
環境についてですが、
>NT4.0SP4 + IIS4.0 + VBScript
ではなかったの?
うちは、NT4.0SP4 + IIS4.0 + VBScript3.1です。
うぐいすさんご指摘の日本語ファイル名の件は、本件とは直接関係しな
いが、一般論として、URL部分に日本語が含まれているのはいかがな
ものか、と言う事だと思います。
理由は分かりませんが、今後の為にも使わないほうが無難では?
>一般によくやるミスは、すでに何らかの情報をクライアントを渡した後
>でRedirectしようとしてエラーが出る事ですが、この点に関しては、
>大丈夫でしょうか。
具体的にソースで示します。
次に示すa.aspはRedirectされますが、b.aspはエラーとなってしまい
ます。<HTML>タグの前で処理するか、Response.buffer=trueとして
aspの最後の処理が終るまで、クライアントに何も返さないようにして
あげることが必要です。
実際に試してみるとよく分かると思います。
----- a.asp -----
<%@ LANGUAGE = VBScript %>
<%
if Request.form("B1")="記憶させちゃう" then
Session("PRA_UID") = Request.form("PRA_UID")
else
Session("PRA_UID") = ""
Response.Redirect "test.asp"
end if
%>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title>おまけ</title>
<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
</head>
<body>
ほげほげ<br>
</body>
</html>
----- a.asp 以上 -----
----- b.asp -----
<%@ LANGUAGE = VBScript %>
<%
Response.buffer=true
'この1行があればb.aspもエラーにならない
if Request.form("B1")="記憶させちゃう" then
Session("PRA_UID") = Request.form("PRA_UID")
else
Session("PRA_UID") = ""
end if
%>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title>おまけ</title>
<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
</head>
<body>
<%
if Session("PRA_UID") = "" then
Response.Redirect "test.asp"
end if
%>
ほげほげ<br>
</body>
</html>
----- b.asp 以上 -----
あっ、それから今気がつきましたが、IISの設定でクライアントに
エラーメッセージを表示させないという設定(デフォルトではない)
になっていると何もエラーが表示されないかも知れません。
これはこちらでは運用上設定変更できないのでご容赦を。
それでは。
うぐいす
1999/12/08(水) 16:58:37
>通りすがりの若輩もの
>うぐいすさんご指摘の日本語ファイル名の件は、本件とは直接関係しないが、
>一般論として、URL部分に日本語が含まれているのはいかがなものか、と言う事だと思います。
そのとおりです。(^^;)
言葉足らずですみません。
通りすがりの若輩ものさん、フォロー有難うございました。m(__)m
うぐいす
1999/12/08(水) 17:00:12
すみません。
なんか慌てて書込みしたので、敬称が抜けてしまいました。
通りすがりの若輩ものさん、本当に申し訳ありません。
通りすがりの若輩もの
1999/12/08(水) 17:39:02
とんでもないですぅ。>うぐいすさん
前述のb.aspですが、そのままではRedirectされてしまいます。
Response.buffer=true
をコメントアウトするとエラーになります。
#慌てて書き込みしたもので。^^;
#ペンネームが長くて一覧表示のテーブルがぶざまになってしまい、
恐れ入りますです。>みなさま
じゅん
1999/12/08(水) 18:05:03
うぐいすさん、通りすがりの若輩ものさん、ご丁寧な回答ありがとうございます。
とても参考になりました。
あれから、色々と調べました。
通りすがりの若輩ものさんのご指摘の通り、私のプログラムミスでした。
申し訳有りませんでした。m(__)m
以下のようにスクリプトを修正したら、正常に動作ました。
修正したログインチェック.aspのプログラム
<%
・
・
On Error Resume Next
Err.Clear 'Errオブジェクトのクリア
Set LcObjConn = server.CreateObject("ADODB.Connection")
LcObjConn.Open("ODBC")
If Err.Number <> 0 Then
'エラー情報をSessionオブジェクトに設定(ログイン画面に表示する)
'コネクションのCloseをコメント
' LcObjConn.Close
Set LcObjConn = Nothing
Call SbErrorProc("エラーです")
End If
・
・
・
Sub SbErrorProc(LcStrMsg)
'エラー情報をSessionオブジェクトに設定(ログイン画面に表示する)
Session("SeMsg") = LcStrMsg
Session("SeErrMsg") = "詳細情報:" & Err.description & "(" & Err.number & ")"
Response.Redirect "ログイン.asp"
End Sub
%>
何が原因だったかと言いますと、LcObjConn.Close が悪さしていました。
LcObjConn.Openが成功していないのに、クローズしたためです。
おそらく、On Error Resume Nextを指定しているので、リダイレクトせず、ログインチェック.aspの処理を続行
していると思われます。
試しに、レコードセットのオープンに失敗して、エラートラップ処理で、レコードセットのクローズを
実行した場合もリダイレクトしませんでした。
度々、質問して申し訳有りません。
コネクション、レコードセットは、Closeしなくても良いものでしょうか?
NothingをセットするだけでOKですか?
[上に]
[前に]
[次に]