トップ回答者
Excelからの起動時(Post?)

質問
-
お世話になっております。
以下問題について質問させてください。
【問題】
Excelにて、アプリケーションのURLが登録されているハイパーリンクをクリックし、アプリケーションを展開したところ、
2度Postが発生してしまう。(さらにSession情報が消えている。)
【事象】
◆アプリ展開
アプリA ⇒ (URL生成) ⇒ アプリB(トップページ) ⇒ (画面遷移(Response.Redirect)) ⇒ アプリB(対象画面)
※アプリ展開は問題なく可能。
また、アプリAにて生成したURLを、ブラウザに入力して展開することも可能。
◆Excel展開
Excel ⇒ (URLクリック) ⇒ アプリB(トップページ) ⇒ (画面遷移(Response.Redirect)) ⇒ アプリB(対象画面) ⇒ アプリB(対象画面)
※アプリB(対象画面)にて、検索パラメータをチェックしております。
検索パラメータは、トップページに渡されたURLパラメータをSession情報に格納しております。
(アプリB(対象画面)では、パラメータが存在しているかをチェックしており、Sessionに格納された検索条件がなくなった為エラーとなってしまう)
トップページから対象画面に遷移し、検索などのサーバ処理が完了した後、なぜか再度対象画面を読み込みます。(サイトマスターの処理も完了した後)
再度Postされている認識ですが、対処方などございますでしょうか。
場合によっては、遷移方法を変更する必要があると考えています。(トップページからの遷移をやめる)
※尚、PostBack はされていませんでした。
【環境】
Visual Studio 2010 Pro
ASP.NET 3.5
Excel 2007
IE8- 編集済み kaijin22 2013年1月23日 3:54
回答
-
お世話になっております。
自身でコメントを追加させていただきます。
遷移方法を、Server.Transferに変更したところ、以下のように遷移しました。
Excel ⇒ (URLクリック) ⇒
アプリB(トップページ) ⇒ (画面遷移) ⇒ アプリB(対象画面) ⇒
アプリB(トップページ) ⇒ (画面遷移) ⇒ アプリB(対象画面)
変更前:Response.Redirect(URL, false);
変更後:Server.Transfer(URL, false);
結果的に、2度ポストされていることに変わりはありません。(ポストというよりは、リクエストという表現の方が正しい?)
ただ、トップページを再度経由することでURLパラメータを再度Sessionに格納することで、やりたいことは実現できました。
他に解決策や不足している内容などありましたら、ご指摘いただけないでしょうか。
よろしくお願いいたします。
◆ASP.NET ページ遷移
http://atamoco.boy.jp/asp/20100823_2.php
===追記事項
事象の詳細は理解できていませんが、対策は上記で問題なさそうです。
その為、当質問はひとまず完了とさせていただきます。
引き続き、「SurferOnWww」様にご指摘いただいた「Fiddler」を利用して調査します。
すべての返信
-
お世話になっております。
自身でコメントを追加させていただきます。
遷移方法を、Server.Transferに変更したところ、以下のように遷移しました。
Excel ⇒ (URLクリック) ⇒
アプリB(トップページ) ⇒ (画面遷移) ⇒ アプリB(対象画面) ⇒
アプリB(トップページ) ⇒ (画面遷移) ⇒ アプリB(対象画面)
変更前:Response.Redirect(URL, false);
変更後:Server.Transfer(URL, false);
結果的に、2度ポストされていることに変わりはありません。(ポストというよりは、リクエストという表現の方が正しい?)
ただ、トップページを再度経由することでURLパラメータを再度Sessionに格納することで、やりたいことは実現できました。
他に解決策や不足している内容などありましたら、ご指摘いただけないでしょうか。
よろしくお願いいたします。
◆ASP.NET ページ遷移
http://atamoco.boy.jp/asp/20100823_2.php
===追記事項
事象の詳細は理解できていませんが、対策は上記で問題なさそうです。
その為、当質問はひとまず完了とさせていただきます。
引き続き、「SurferOnWww」様にご指摘いただいた「Fiddler」を利用して調査します。
-
わからないことが多すぎます。
アプリA とかアプリB とは何ですか? 別の Web アプリケーションですか、それとも同じ Web アプリケーションの別ページのことですか?
(1) アプリA ⇒ (URL生成)⇒ アプリB(トップページ)⇒・・・
の URL は、
(2) Excel ⇒ (URLクリック)⇒ アプリB(トップページ)⇒・・・
の URL とクエリ文字列その他(もし認証チケットが埋め込まれていればそれも)をすべて含めて全く同じですか?
また、上記の (1) の部分は、
ブラウザ立ち上げ ⇒ URL 手入力 ⇒ アプリB(トップページ)⇒・・・
としても同じ結果になるのですよね?
そうであれば、「Excel ⇒ (URLクリック)」は「ブラウザ立ち上げ ⇒ URL 手入力」と同じことのはずですので、(1) と (2) で動きが違うことはあり得ないですが。
質問に書いてないところでどこか違うところがあるのではないですか?
Fiddler などのパケットキャプチャツールを使って、サーバーとクライアントのやり取りを調べてください。特に、ブラウザからの要求がどのように出ているか、セッションクッキーがどのようにやり取りされているかあたりに注目です。
-
追加で (画面遷移) とはなんですか? 同じ行に (URLクリック) があるということは、クリック以外の方法での画面遷移なのですよね?
なおWebの話題において「ポスト」という言葉は HTTP POST を表します。(<form action="" method="POST">のこと)
質問者さん専用のオレオレ用語が多すぎて、何を知りたいのかすらわかりません。
なんとなくな予想ですが、 Response.Redirect(URL, false); や Server.Transfer(URL, false); が不適切な位置に記述されているのかな。
-
SurferOnWww様
返信ありがとうございます。
インラインにて失礼します。
>アプリA とかアプリB とは何ですか? 別の Web アプリケーションですか、それとも同じ Web アプリケーションの別ページのことですか?
別アプリになります。
アプリAの画面から、アプリBの画面を呼び出しています。
>URL とクエリ文字列その他(もし認証チケットが埋め込まれていればそれも)をすべて含めて全く同じですか?
URL自体は同じものです。認証チケットは埋め込まれていません。
(クエリ文字列として渡すのは「利用画面名」と「検索パラメータ」の2つになります。
(ExcelでクリックしたURLを、起動してあるブラウザのURLに入力すると、問題なく起動
>また、上記の (1) の部分は、
>ブラウザ立ち上げ ⇒ URL 手入力 ⇒ アプリB(トップページ)⇒・・・
>としても同じ結果になるのですよね?
>そうであれば、「Excel ⇒ (URLクリック)」は「ブラウザ立ち上げ ⇒ URL 手入力」と同じことのはずですので、(1) と (2) で動きが違うことはあり得ないですが。
>質問に書いてないところでどこか違うところがあるのではないですか?
ブラウザ立ち上げ後、URLを手入力した場合も、(1)と同じ結果になります。
また、『Response.Redirect』から『Server.Transfer』に書き換えたのみで、ほかに変更箇所はありません。
>Fiddler などのパケットキャプチャツールを使って、サーバーとクライアントのやり取りを調べてください。特に、ブラウザからの要求がどのように出ているか、セッションクッキーがどのようにやり取りされているかあたりに注目です。
こういったツールを知りませんでした。
一度ツール自体を調べ、インストール・利用してみます。
- 編集済み kaijin22 2013年1月24日 1:05
-
佐祐理様
返信ありがとうございます。
インラインにて失礼します。
>追加で (画面遷移) とはなんですか? 同じ行に (URLクリック) があるということは、クリック以外の方法での画面遷移なのですよね?
ご指摘の通り、トップページの処理にて自動遷移します。
アプリBでは、アクセスをトップページに集約しております。
アプリBの画面を利用する際は、必ずトップページを経由する流れとしています。===
>なおWebの話題において「ポスト」という言葉は HTTP POST を表します。(<form action="" method="POST">のこと)
【アプリB】
・トップページ
⇒画面A
⇒画面B
⇒画面C
⇒エラー画面(起動パラメータが不足している場合)
===
>質問者さん専用のオレオレ用語が多すぎて、何を知りたいのかすらわかりません。
申し訳ございません。勉強・努力します。
何が知りたいかというのは、『なぜExcelから起動された場合は、2回リクエストが呼ばれるのか。になります。』
(ブラウザ起動後にURLを直接入力するのとなぜ違うのか
※Response.Redirectが一度クライアントに処理を返す流れなのは把握しています。詳しくは分かっていませんが。。。
>なんとなくな予想ですが、 Response.Redirect(URL, false); や Server.Transfer(URL, false); が不適切な位置に記述されているのかな。
『不適切な位置』とはどのようなものでしょうか。
処理では、『ページロード⇒メソッドA⇒メソッドB(Response.Redirect)』のような流れになっています。
ただ、「Response.Redirect」以降の処理はほぼありません。
※switch文に対するのbreak程度は実行していますが。 -
SurferOnWww様
申し訳ございません。
見直すと、身勝手な発言をしていたことに気づきました。
ご指摘の通り、当スレッドは私以外の方に有益な情報ではないと思われるので、後日削除いたします。
fiddlerなどを利用して分析した結果、まだ不明点が挙がりましたら、再度質問させてください。
その際は、再度ご意見・ご指摘いただければ幸いです。
>ご指摘の通り、当スレッドは私以外の方に有益な情報ではないと思われるので、後日削除いたします。
申し訳ございません。
自分の判断でスレッドを削除する方法はないようです。
http://social.technet.microsoft.com/Forums/ja-JP/suggestja/thread/096809a5-1b3e-4f87-8bc0-550ee5044bae
- 編集済み kaijin22 2013年1月28日 1:46