- PR -

Webサービスの呼出とjavascriptの同時実行

1
投稿者投稿内容
g13_m16ar
会議室デビュー日: 2008/06/10
投稿数: 4
投稿日時: 2008-06-10 01:26
C#.NET において、Webサービスの呼出(Facade)時にjavascriptを利用し、
イメージボタンの表示制御(切換)を行いたいのですが、
SSL認証の際に当該イメージが正常に表示されません。

そもそも、Webサービスの呼出(Facade)をする場合はAPサーバからの応答を
受信するわけですから、同時にjavascriptにてWEBサーバ側の制御を行う事自体が
プログラムとして間違っているのでしょうか。

しかしながら、SSL(HTTPS)ではなく通常のHTTPの場合は問題なくイメージボタンの
表示制御が行われます。

問題がSSLの問題なのか、構文の不正なのか、考え方が間違っているか
行き詰っている状況です。

※APサーバからの応答により制御を変化させるわけではなく、イメージボタンの
 押下時に、別のイメージボタンの表示状態を変更しつつ、同時にWebサービスの
 呼出を行いたいのです

皆々様で、このようなご経験はありませんでしょうか。

ご教授頂きたくよろしくお願いいたします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-06-10 08:40
ちょっと具体的な処理の流れがわかりません。
Webサービスはjavascriptから呼んでるのか(つまりAjax)そうでないのか、とか。

もしAjaxであれば、非同期ですから、Webサービスを呼び出しつつ、
ボタンのイメージを変更するというやり方は間違っていないと思います。

引用:
しかしながら、SSL(HTTPS)ではなく通常のHTTPの場合は問題なくイメージボタンの
表示制御が行われます。

であればSSLの問題の可能性が強くないですか?
例えばhttp https間でセッションは引き継がれなかった気がします。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-06-10 10:02
引用:

g13_m16arさんの書き込み (2008-06-10 01:26) より:
しかしながら、SSL(HTTPS)ではなく通常のHTTPの場合は問題なくイメージボタンの
表示制御が行われます。

問題がSSLの問題なのか、構文の不正なのか、考え方が間違っているか
行き詰っている状況です。


良く分かりませんが、SSL でなければ目論見どおり動いていて、SSL にするとそれだけで動かなくなる、ということは確かでしょうか?

「イメージボタンの表示制御」というのが具体的になんなのかが良く分かりませんが、SSL の場合、イメージファイル(.gif/.jpeg など)も、SSL(HTTP)でアクセスできる場所に置いておかないと、もしかしたらトラブルになる可能性もあるかもしれませんが、今はどこに置かれているでしょうか?

今、なにが動かないのでしょうか?
イメージがブラウザー上に表示されない?イメージが切り替わらない?
Webサービスは呼べている?
g13_m16ar
会議室デビュー日: 2008/06/10
投稿数: 4
投稿日時: 2008-06-10 11:20
説明不足で大変申し訳ありません。

まず、コードはaspx aspx.cs を利用しコーディングしています。

画面(aspx側)のイメージボタンに、OnClick="AAAbtn_Click"を定義し、
cs側で、JavaScriptを埋め込みでaspxを生成します。

埋め込みコードです。
"JavaScript:document.getElementById('{0}').disabled = false;
document.getElementById('{0}').src = \'../Images/変更後のイメージ.gif\';";


下記が生成されたaspxコードです。
<input type="image" name="ccc" id="AAA" title="タイトル" src="../Images/押下するイメージ.gif"
onclick="JavaScript:document.getElementById('AAA').disabled = false;
document.getElementById('AAA').src = '../Images/変更後のイメージ.gif';" style="border-width:0px;" />

「押下するイメージ.gif」を押下された場合に、JavaScriptにて'AAA'というイメージを
「変更後のイメージ.gif」に置き換える事を行い、同時にaspxにて定義した、
OnClick="AAAbtn_Click"イベントの処理(Webサービスの呼出)を行いたいのです。

その結果、AAAbtn_Clickイベントは問題なく処理が行われるのですが、
「変更後のイメージ.gif」に置き換える処理が正しく処理されず、
イメージが非表示状態になってしまいます。
(イメージは非表示ですが、領域は存在し、ボタン押下も可能です。)

因みに、AAAbtn_Clickイベントではサーバ側からのファイルダウンロードの為、
ダウンロード画面が表示される処理です。

また、当該イメージはSSLでも利用できる階層に配置されており、その点は問題ありません。

なお、なぜか下記のように、イメージ変更構文の後に、アラートを表示させると
イメージも正常に表示されます。
<input type="image" name="ccc" id="AAA" title="タイトル" src="../Images/押下するイメージ.gif"
onclick="JavaScript:document.getElementById('AAA'').disabled = false;
document.getElementById('AAA'').src = '../Images/変更後のイメージ.gif';
alert('アラート');" style="border-width:0px;" />

当該事象を踏まえますと、セッションが引き継げなかった場合、アラートを行っても
イメージが表示されないと想定されますが、如何でしょうか。

以上、宜しくお願い致します。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-06-10 23:30
引用:

g13_m16arさんの書き込み (2008-06-10 11:20) より:
なお、なぜか下記のように、イメージ変更構文の後に、アラートを表示させると
イメージも正常に表示されます。
<input type="image" name="ccc" id="AAA" title="タイトル" src="../Images/押下するイメージ.gif"
onclick="JavaScript:document.getElementById('AAA'').disabled = false;
document.getElementById('AAA'').src = '../Images/変更後のイメージ.gif';
alert('アラート');" style="border-width:0px;" />


イメージのロードを待つと良いのでしょうかね。なんとなくそんな気がします。
onclick で動くコードは提示されたコードがすべてなのでしょうか?ほかにも連鎖で動くコードがあって、それがイメージのロードを邪魔しているというようなことはないでしょうか?
AAA の onload イベントハンドラーにデバッグ用に alert などを実行するようなコードを埋め込んで動かすと、それは動くでしょうか?
また、"変更後のイメージ.gif" を JavaScript でロードするのではなく、単なる img タグで書いておいてあらかじめロードしておいたらどうなるでしょうか?

私が思いつくその場しのぎのデバッグ方法は、ここまでです。

なお、提示されたコードだと AAA を囲むシングルクォーテーションの数が変ですが、それは大丈夫なのですよね?
g13_m16ar
会議室デビュー日: 2008/06/10
投稿数: 4
投稿日時: 2008-06-11 00:07
度々のご返信有難うございます。

まずonclickにて動作するコードはこの部分のみになります。

また、再調査したところ、SSLに限定する事はなく、HTTP環境のレスポンスの
悪い状況で行った際、同様の事象が発生いたしました。
従いまして、SSLが原因というのはありえないかと思われます。

さらに、onload イベントハンドラーにデバッグ用にalertなどを
実行するようなコードを埋め込んで動かしてもアラート画面は表示されません。
(onload イベントハンドラーはFacade呼出でサーバ側応答を受信後、
 PDFを作成するロジックになります)
そもそもFacade呼出メソッド内でアラート表示を行えた記憶がありません。。
大概、ログファイル出力でデバックしておりましたもので。。

また、AAAタグのシングルコーテーションは問題ありません。
解りやすくIDを置き換えた為、投稿上の誤記でございます。

そこで「イメージのロードを待つ」というのは、waitとかということでしょうか?
確かに単なるimgタグを用いるというのもひとつの手かもしれません。

今現時点で改修する方法としては、JavaScriptとWebサービスのsubmit()を、
JavaScriptのみで行う方法がスマートなのかとも思える状況でございます。
(一般的に、JavaScriptとWebサービスのsubmit()を同時実行するのは、
 推奨されるか疑問点はあります。)

しかしながら、なぜイメージが非表示になっているのか。。
(恐らくIEとしては、表示しきっていると思っているのでしょうか。。)
また、Firefoxでは当該事象は発生しませんし。。

とても煮え切らない状況であります。。

取り合えず、コードの構成を変更し、再調査してみます。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-06-11 07:22
引用:
当該事象を踏まえますと、セッションが引き継げなかった場合、アラートを行っても
イメージが表示されないと想定されますが、如何でしょうか。

SSLやセッションは関係なさそうですね。

Images/変更後のイメージ.gif のレスポンスが先か、
ダウンロード画面(ダウンロードダイアログですか?)を表示しているレスポンスが先か、
という違いだと思います。後者が先の場合、ページ遷移が完了している状態なので、
前のページに対してはブラウザは何も行いません。ダウンロードでなく、普通のページだったら
どうなるか考えてみてください、前者のレスポンスが間に合えば画像が変わってから遷移したように
見えますが、間に合わなかったら見えませんよね。

引用:
今現時点で改修する方法としては、JavaScriptとWebサービスのsubmit()を、
JavaScriptのみで行う方法がスマートなのかとも思える状況でございます。
(一般的に、JavaScriptとWebサービスのsubmit()を同時実行するのは、
 推奨されるか疑問点はあります。)

私もいい方法とは思いません。
常套手段としては、隠しframeかiframeを用意しておいて、ダウンロードダイアログは
そこをtargetにするといった方法や、Ajax化することでしょうか(ファイル出力の場合は厳しいかな・・)

#Webサービスというのがよくわかりませんが普通のWEBページでファイル出力しているだけですよね?
g13_m16ar
会議室デビュー日: 2008/06/10
投稿数: 4
投稿日時: 2008-06-11 17:47
度々、お世話になります。

私もご指摘のとおり、ダウンロードダイアログの表示が何かしらの
制御に問題を起こしていると思われる次第です。

現在、他業務の為、調査できておりませんが、
対処方法の抽斗としてとても勉強になりました。

尚、Webサービスの呼出とは、SQLサーバのBLOBデータを取得し、
ArExports.Pdf.PdfExportを用いて、MemoryStreamにPDFエクスポート
を行っている処理になります。
(普通のWEBページでのファイル出力とは多少異なります。)

有難うございました。
1

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