- PR -

Webページが出力されない?

投稿者投稿内容
やす
会議室デビュー日: 2001/12/18
投稿数: 8
お住まい・勤務地: 東京都
投稿日時: 2006-02-17 15:18
こんにちは、.NET FW1.1 でASP.NETのWebサイトを開発しております。

現在開発中のWebアプリケーションで不可解な現象に悩んでおります。
皆さんのお知恵を拝借できればと思い投稿しました。
よろしくお願いします。

(現象)
A.aspx と B.aspx の2つのaspxがあります。
A.aspx を表示し、ページ内にあるButtonコントロールをクリックすると
内部で外部プロセスを起動し、終了後にB.aspxへ Response.Redirect する
という処理が行なわれます。
このとき、AページからBページへ Response.Redirect しても
ブラウザにB.aspxが表示されない。

(ここまでの調査結果)
A.aspx、B.aspx で各イベントのタイミングでログ出力させてみると
以下の処理が行なわれています。(Page_Load以降のみ)
---(ログ内容ここから)
A.aspx
"2006/02/17 13:24:08 : Page_Load - START"
"2006/02/17 13:24:08 : Page_Load - END"
"2006/02/17 13:24:08 : btnXX_Click - START"
"2006/02/17 13:24:21 : btnXX_Click - Method Call START"
"2006/02/17 13:27:41 : btnXX_Click - Method Call END (result true)"
"2006/02/17 13:27:41 : btnXX_Click - END (Redirect to B.aspx)"
"2006/02/17 13:27:42 : btnXX_Click - catch ThreadAbortException ([mscorlib] スレッドを中止しようとしました。)"
---
B.aspx
"2006/02/17 13:27:41 : Page_Load - START"
"2006/02/17 13:27:42 : Page_Load - END"
"2006/02/17 13:27:42 : Page_PreRender - START"
"2006/02/17 13:27:42 : Page_PreRender - END"
"2006/02/17 13:27:42 : Page_Unload - START"
"2006/02/17 13:27:42 : Page_Unload - END"
---(ログ内容ここまで)

このログを見る限り、B.aspxは表示されるはずと
考えておりますが、ブラウザから見える状況は、
A.aspx のまま応答を待っているばかりです。
IEの下部にあるステータスバーには、Aページにあるボタンクリックの
タイミングで表示された「http://xxx/A.aspx を開いています。」が
ず〜っと表示されたままです。
ときどき「サーバが見つかりません。」と表示されることもあります。
(現象の切り分けはまだできていません。)

どなたか、こんな現象をご存知ありませんか?
すでにお手上げ状態です。

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-02-17 15:36
ログによると B.aspx にリクエストはある、という結果なんですよね。

A.aspx のスレッド中止が 13:27:42
B.aspx の Page_Load が 13:27:41
というのが不可解なんですけども、おかしくないのかな。

ThreadAbortException を握り潰していないですよね?

_________________
囚人のジレンマな日々
やす
会議室デビュー日: 2001/12/18
投稿数: 8
お住まい・勤務地: 東京都
投稿日時: 2006-02-17 15:46
返信ありがとうございます。

引用:
ThreadAbortException を握り潰していないですよね?


ソースコードでは、
Response.Redirect("B.aspx")
しか記述していません。
ログを吐くようにするときに、念のためRedirect命令だけを
Try〜Catchで括ってみました。(Re)Throwはしていません。

以下、該当箇所のソースコード(VB.NET)です。

コード:

Try
    xWriteLog("btnXX_Click - END (Redirect to B.aspx)")
    Response.Redirect("B.aspx")

Catch tex As Threading.ThreadAbortException

    xWriteLog("btnXX_Click - Redirect catch ThreadAbortException ([" & tex.Source & "] " & tex.Message & ")")

End Try

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-02-17 15:56
引用:

Try〜Catchで括ってみました。(Re)Throwはしていません。


(Re)Throw をしてみて下さい。
_________________
囚人のジレンマな日々
やす
会議室デビュー日: 2001/12/18
投稿数: 8
お住まい・勤務地: 東京都
投稿日時: 2006-02-17 17:39
返信ありがとうございます。
Throwしてみました。現象は変わりませんでした。

前回 囚人さんから
引用:
A.aspx のスレッド中止が 13:27:42
B.aspx の Page_Load が 13:27:41
というのが不可解なんですけども、おかしくないのかな。


というご指摘があったので、ログ出力をミリ秒単位にしてみました。

---(ログ内容ここから)
A.aspx
"2006/02/17 17:22:40:5978 : Page_Load - START"
"2006/02/17 17:22:40:7385 : Page_Load - END"
"2006/02/17 17:22:43:9735 : Page_Load - START"
"2006/02/17 17:22:43:9735 : Page_Load - END"
"2006/02/17 17:22:43:9735 : btnXX_Click - START"
"2006/02/17 17:22:43:9735 : btnXX_Click - Method Call START"
"2006/02/17 17:26:28:9627 : btnXX_Click - Method Call END (result true)"
"2006/02/17 17:26:33:5099 : btnXX_Click - END (Redirect to B.aspx)"
"2006/02/17 17:26:33:5256 : btnXX_Click - Redirect catch ThreadAbortException ([mscorlib] スレッドを中止しようとしました。)"
---
B.aspx
"2006/02/17 17:26:33:5568 : Page_Load - START"
"2006/02/17 17:26:35:1038 : Page_Load - END"
"2006/02/17 17:26:35:1038 : Page_PreRender - START"
"2006/02/17 17:26:35:1038 : Page_PreRender - END"
"2006/02/17 17:26:35:1194 : Page_Unload - START"
"2006/02/17 17:26:35:1194 : Page_Unload - END"
---(ログ内容ここまで)

やはり前回は不可解だったようです。出力内容をミリ秒にしてから
何度か試しましたが、スレッド中止が Page_Load より遅い現象は
発生しませんでした。

また、そもそもdebug用にCatchしていたので、
Try〜Catch句を使用せず直接 Redirect しても現象は回避できませんでした。。

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-02-17 21:14
ん〜なんでしょうね。
ログは、B.aspx にリクエストがあると書いてあるようですが、
引用:

IEの下部にあるステータスバーには、Aページにあるボタンクリックの
タイミングで表示された「http://xxx/A.aspx を開いています。」が
ず〜っと表示されたままです。


は、ブラウザは A.aspx からレスポンスがない(か開いている最中。)と言っています。

もし、ログの言う状況になっていれば、「http://xxx/B.aspx を開いています。」じゃないのかなぁ。

A.aspx に問題があるのか B.aspx に問題があるのか…。
問題がありそうな箇所のソースを見せていただけるでしょうか。
_________________
囚人のジレンマな日々
やす
会議室デビュー日: 2001/12/18
投稿数: 8
お住まい・勤務地: 東京都
投稿日時: 2006-04-05 14:18
現象の原因がわかりましたのでここに記録しておきます。

この現象はA.aspx、B.aspxともに処理は正常動作していました。
サーバ側処理は問題ないということで、サーバとクライアントの
通信を監視してみたところ、約120秒でHTTPレスポンスが切断されていることが
わかりました。

このタイマーイベントはIISに作成したサイトのプロパティで
「HTTPレスポンスタイムアウト」が初期値120秒に設定されて
いたためと判明し、この値をたとえば600秒とすることで現象の
回避ができました。

根本解決ではありませんが、回避策のひとつとして有効と考えます。

レスいただいた皆様には大変感謝いたします。
今後ともよろしくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-04-05 21:33
引用:

囚人さんの書き込み(2006-02-17 15:36)より:

ThreadAbortException を握り潰していないですよね?


 ThreadAbortException は、例外の中でも特別で、握りつぶそうとしても勝手に再スローされます。
引用:

[url=http://msdn2.microsoft.com/ja-JP/library/system.threading.threadabortexception(VS.80).aspx]ThreadAbortException クラス[url] より:

ThreadAbortException は、キャッチできても、 catch ブロックの末尾でもう一度自動的に発生する特殊な例外です。この例外が発生すると、ランタイムは、スレッドを強制終了する前に finally ブロックをすべて実行します。



引用:

やすさんの書き込み(2006-04-05 14:18)より:

通信を監視してみたところ、約120秒でHTTPレスポンスが切断されていることがわかりました。


 サーバの実行が行われれば、問題はないのでしょうか?クライアント側にも、タイムアウト値が存在していると思います。IE6 では待ってくれるものが、IE7b を入れている環境で待ってくれない事象が発生しています。
 例えば、Web アプリケーションのデバッグのために処理を止めますが、IE6 では気長に待ってくれていたのに、IE7b では、勝手に「サーバからレスポンスがない」旨、メッセージ出力されます。

スキルアップ/キャリアアップ(JOB@IT)