none
Webサービスを経由させて動作させたFormアプリケーション内の WebBroserが正しく動作しない。 RRS feed

  • 質問

  • Webサービスを経由させて動作させたFormアプリケーション内の
    WebBroserが正しく動作しない。

    はじめまして。
    初めてフォーラムを利用させてもらいます。

    Webサービスを経由させて動作させたWindowsFormアプリケーション内の
    WebBroserコントロールが正常に動作しないため、フォーラムに
    投稿させてもらいました。

    現在、以下の環境で動作するWebサービスアプリケーションを動作させようと
    しています。

    [環境]
    WindowsServer 2003 R2 SP2
    IIS6.0
    .Net Framework 2.0
    Internet Exploer 6.0
    上記の環境にWebサービスとWindowsFormアプリケーションを配置。

    [Webサービスについて]
    Webサービスはクライアントから要求が来た場合、同環境に配置してある
    WindowsFormアプリケーションを外部プロセスとして起動する。
    WebサービスはWindowsFormアプリケーションを起動後、WindowsFormアプリケーション
    が終了するまで待機する。
    起動されたWindowsFormアプリケーションはファイルに情報を保存した後、
    プロセスを終了する。
    WindowsFormアプリケーションが終了した後、Webサービスに制御が移る。
    そして、WindowsFormアプリケーションが保存したファイルの内容を読込、
    読み込んだ内容をクライアントに応答として返す。

    [WindowsFormアプリケーションについて]
    内部にWebBrowserコンポーネントを持つWindowsFormアプリケーション。
    Webサービスから起動されるとWebBrowserコンポーネントを利用して、
    サイトにアクセスして必要な情報を取得。必要な情報を取得後、
    ファイルに情報を保存してプロセスを終了する。

    [処理の流れについて]
    具体的な処理の流れを記載すると以下のようになります。
    1.ブラウザからWebサービスにアクセス
    2.WebサービスがWindowsFormアプリケーションを外部プロセスとして起動
    3.WindowsFormアプリケーションは自分が保持するWebBroserコンポーネントを利用して
     サイトにアクセス。
    4.サイトはNTLM認証を要求してくるため、WebBrowserコンポーネントを利用して
      NTLM認証を通過
    5.NTLM認証通過後、要求したHTMLがダウンロードされる。
    6.ダウンロードしたHTMLにはJavaScript(フォームをサブミットするjavascript)が
     含まれており、WebBrowserコンポーネントを利用してこのJavaScriptを実行
    7.JavaScriptを実行した結果、再度、サイトからリソース(HTMLファイル)が
     ダウンロードされる。
    8.7で取得したHTMLファイルをファイルに保存したら、WindowsFormアプリケーション
      を終了させる
    9.Webサービスに制御が戻り、WindowsFormアプリケーションが保存したファイルの内容を 読込
    10.読み込んだ内容をクライアントに応答として返却する

    [問題点]
    処理の流れで記載した手順6の箇所でWebBrowserがJavaScriptを実行するが
    フォームがサブミットされない。その結果、WebBrowserのDocumentCompleteイベントが
    呼ばれず処理が停止してしまうこと。

    なお、本問題はWindows XPの開発環境(Visual Studio 2005 Proffessional)で
    Webサービスを起動し、外部プロセスとしてWindowsFormアプリケーションを
    実行した場合には発生しません。(意図通り動作しました)


    本問題が発生する原因および解決方法としてどのようなことが考えられるのでしょうか。皆様のお知恵を貸して頂ければ幸いです。

    なお、質問する前までにこちらで対応したことを以下に記載させて頂きます。
    [対応したこと]
    ・WindowsFormアプリケーション単独で動作するかどうかを確認しました。
     その結果、単独では動作できることを確認しました。
    ・アプリケーションプールの作成
      WindowsFormアプリケーションを単独で動作させた時、ユーザーID「HOGE」の
     権限で動作させてました。このため、Webサービスを動作させるアプリケーション
     プールのIDも「HOGE」にしました。
     上記アプリケーションプールを割り当てたWebサービスからWindowsForm
      アプリケーションを起動した結果、実行ユーザーは正しくユーザーID「HOGE」で
     あることを確認しました。
     しかし、Webサービス経由で実行させると問題点に記載したようにフォームを
     サブミットするJavaScriptが動作せず、WebBrowserのDocumentCompleteイベントが
      呼ばれませんでした。
    ・InterExplorerのセキュリティ設定を変更しました。
     ユーザー「HOGE」でWindowsServer 2003にログインしてIEのセキュリティ設定を
     変更しました。具体的にはJavaScriptを実行できるようにIEの設定を変更しました。


    2012年5月30日 5:03

すべての返信

  • 回答ではないですが、Windows Server 2008からはWebサービスからWindows Formアプリケーションを起動できなくなるため、根本的な設計から見直すことをお勧めします。
    2012年5月30日 5:19
  • ご回答ありがとうございます。

    ご指摘の通り、Windows Server 2008に移行する際には根本的な解決を図る必要があると考えております。

    現在、一時しのぎ的に今回、記載した内容の対処を行っています。

    本当は最初からWindows Formアプリケーションを利用せず、Webサービスだけで解決を図れればよかったのですが

    諸々の制約上、そのような対処を行うことができませんでした。

    お忙しい中、ご返信頂いてありがとうございました。

    2012年5月30日 5:48
  • 私の読み取り方が足りないのかもしれないのですが、

    > 2.WebサービスがWindowsFormアプリケーションを外部プロセスとして起動

    これはリクエストがあったらWindowsFormアプリケーションをサーバ上で実行するという意味でしょうか?
    もしそうなら、なぜサーバ上で動かすものをWindowsFormアプリケーションにしているのか疑問に思います。

    単にsubmitするだけならHttpWebRequestクラスとかで出来るように思いますが、どうでしょうか。
    2012年5月30日 5:56
  • ご返信いただきありがとうございます。

    >これはリクエストがあったらWindowsFormアプリケーションをサーバ上で
    >実行するという意味でしょうか?
    はい、その通りです。

    >単にsubmitするだけならHttpWebRequestクラスとかで出来るように思いますが、
    >どうでしょうか。
    ご指摘の通りです。
    単純にサブミットするだけであればHttpWebRequestクラスを
    利用することで対処可能です。
    しかし、残念ながら単純なサブミット処理だけはないのです。(詳細な記載ができておらずすいません)
    HttpWebRequestを採用できない理由が2つありました。


    今回、実行するJavaScriptは最終的にはフォームのPostを行うjavaScriptになります。
    しかし、フォームのPostを行う前段階でもいくつかのJavaScriptメソッドを実行する
    必要があります。
    HttpWebRequestを採用した場合、Htmlに含まれているscriptタグを全てダウンロード
    して必要なJavaScriptファイルを取得することは可能です。
    しかし、HttpWebRequestはJavaScriptの実行まではサポートしていないので
    取得してきたJavaScriptを実行することはできません。
    このため、JavaScriptの実行もサポートしているWebBrowserを採用しました。


    今回、情報を取得しているサイトはNTLM認証でユーザーを認証し、認証後はクッキーの
    セッションIDでアクセスしてきたユーザーが認証されているかどうかを確認します。
    連続してリクエストを行う場合、WebBrowserであればセッションを引き継いだまま
    アクセスが可能でしたが、HttpWebRequestではセッションを引き継いだままアクセスすることが不可能でした。
    予め、CookieContainerを作成し、作成したCookieContinerを
    一度目のリクエストと2度目のリクエストで引き継ぐようにしたのですがうまく
    セッションを維持できませんでした。ここに関しては原因は不明なのですが、
    この問題もあり、WebBrowserを採用しました。

    また、外部プロセスとしてWindowsFormアプリケーションを採用したのは
    以下の理由です。
    ・今回のWebサービスは当然ながら複数のユーザーにアクセスされることを
     前提に作成しています。しかし、同一のプロセスで複数のWebBrowserを
     起動した場合、同一プロセス内ではセッションが共有されてしまいます。
     アクセスしてきたユーザーごとに異なるセッションにしたかったため、
     別プロセスとしてWindowsFormアプリケーションを起動することで
     本件に対処しました。

    今、行おうとしていることは私自身、特殊なやり方であることは重々、承知
    なのですが、何らかの解決策を見いだせればと考えています。
    2012年5月30日 7:10
  • > 1.ブラウザからWebサービスにアクセス

    まず、ここが普通じゃないような気がしますが、正しいですか。

    以下のようになっているなら、これも普通ではないと思いますが、とりあえずは
    納得できるのですが。

    ブラウザ ⇒ IIS6 (ASP.NET Web アプリ) ⇒ Web サービス(WebBrowser) ⇒ 別の Web アプリ

    2012年5月30日 12:47
  • 返信ありがとうございます。
    今回の通信経路を下記に記載します。

      クライアントPC  |  Webサービス、WindowsFormアプリケーションをデプロイしたサーバー      |  外部サーバー |
      ブラウザ         → IIS6(ASP.NET Webサービス) → IIS6(WindowsFormアプリケーション)  → 別のWebアプリ

    上記のような経路となっております。質問時の文面がわかりづらく誤解を与えたようですいません。
    上記のような経路でIIS6(WindowsFormアプリケーション)から別のWebアプリに要求を
    出す時、別のWebアプリはNTLM認証を要求してきます。この認証を通過後、要求したHTMLがダウンロードされます。
    そして、このダウンロードしたHTMLにはJavaScriptが含まれており、WebBrowser
    コンポーネントを利用してこのJavaScriptを実行しています。
    このJavaScriptを実行した結果、WindowsFormアプリケーションを単独で動作させた場合とWebサービス経由で動作させた場合で動作が異なっています。

    ・IIS6(WindowsFormアプリケーション)  → 別のWebアプリの場合
    JavaScriptを実行した結果、別のWebアプリに対してPost要求が行われ、
    htmlが応答として返却される。

    ・IIS6(ASP.NET Webサービス) → IIS6(WindowsFormアプリケーション)  → 別のWebアプリ
    JavaScriptを実行してもPost要求が行なわれない。
    WebBrowserがJavaScriptを実行できていない挙動になっている。

    IIS6(ASP.NET Webサービス) → IIS6(WindowsFormアプリケーション)の経路でWindowsFormアプリケーションを起動させた場合、何らの設定により、

    動作が制限されているように思えるのですが、それが何なのかが分からない状況です。


    2012年5月31日 2:31
  • 質問ばかりですみません。まだ、構成が理解できません。

    > ブラウザ → IIS6(ASP.NET Webサービス)

    とのことですが、この「ASP.NET Webサービス」とは、以下のページに書かれ
    ている機能のことを意味していますか?

    リモート・データ活用術~ASP.NET Webサービス編~
    http://www.atmarkit.co.jp/fdotnet/chushin/introwinform_10/introwinform_10_01.html

    10 行でズバリ!! ASP.NET による Web サービスの開発 (C#)
    http://code.msdn.microsoft.com/10-ASPNET-Web-C-fcce7d0e

    であれば、自分が知る限り、

    > ブラウザ → IIS6(ASP.NET Webサービス)

    ということはないはずですが(試験的に接続するとか、AJAX を使って非同期
    要求を行うようなケースは除く)。

    実際は、以下のようになっているということではないのでしょうか?

    ブラウザ ⇒ IIS6 aspx ページ(WebBrowser 実装) ⇒ 別の Web アプリ

    違っていたら失礼しました。


    > IIS6(WindowsFormアプリケーション)から別のWebアプリに要求を
    > 出す時、別のWebアプリはNTLM認証を要求してきます。

    ここも分からないところです。統合 Windows 認証でシングルサインオンになっ
    ているという意味ですか?

    とすると、Windows Form アプリ単独実行と、Web サービス(アプリ?)で
    Windows Form アプリを実行した場合とではユーザーが異なるため、後者の場
    合はシングルサインオンできないということはないですか?

    > JavaScriptを実行してもPost要求が行なわれない。
    > WebBrowserがJavaScriptを実行できていない挙動になっている。

    それはどのように確認されたのでしょうか? 認証が通って応答が帰ってき
    ているが、JavaScript が実行されないということが確認されたのでしょうか?

    • 回答の候補に設定 山本春海 2012年7月3日 8:24
    2012年5月31日 13:38
  • SurferOnWwwさん

    >質問ばかりですみません。まだ、構成が理解できません。
    こちらこそ質問につきあって頂いてありがとうございます。
    また、正確に伝えきれておらずすいません。

    >「ASP.NET Webサービス」とは、以下のページに書かれ
    >ている機能のことを意味していますか?
    はい、ご認識の通りです。
    こちら私がちゃんと文章に記載していなかったのですが、SurferOnWwwさんが
    記載されておりますように試験的にブラウザを利用してWebサービスの動作確認をしています。
    実際作成するシステムではこのブラウザの部分が通常のアプリケーションになります。
    内容に不足がありすいません。
    ですので、正確に経路について正確に書き直させて頂きますと以下のようになります。
    ======================================================
    ブラウザ(Webサービスを試験的に確認するために利用)→IIS6 asmx サービス(サーバーAに配置)→
    WindowsFormアプリケーション(サーバーAに配置)→Webアプリ(サーバーBに配置)

    なお、サーバーAとサーバーBは同一LAN内に存在する。
    また、asmx サービスはProcess.Startメソッド(外部プロセス起動メソッド)を利用して
    WindowsFormアプリケーションを起動する
    ======================================================

    >ここも分からないところです。統合 Windows 認証でシングルサインオンになっ
    >ているという意味ですか?
    はい、ご認識の通りです。

    >とすると、Windows Form アプリ単独実行と、Web サービス(アプリ?)で
    >Windows Form アプリを実行した場合とではユーザーが異なるため、後者の場
    >合はシングルサインオンできないということはないですか?
    私も初めはその可能性を疑いました。
    ユーザー「HOGE」でログインしてWindows Form アプリ単独実行した場合、正常に動作しました。
    このため、Webサービスを処理するアプリケーションプールのIDをユーザー「HOGE」にして、
    WindowsFormアプリケーションを実行させたのですが、Webサービス経由で動作させた場合は
    WindowsFormアプリケーションは正常に動作しませんでした。
    (WebBrowserのJavaScriptが処理されず、そのままイベント待ち状態になってしまう。)
    この時のWindowsFormアプリケーションの実行ユーザーを調査したのですが、意図通り、
    ユーザー「HOGE」で動作をしていました。

    >それはどのように確認されたのでしょうか? 認証が通って応答が帰ってき
    >ているが、JavaScript が実行されないということが確認されたのでしょうか?
    今回のJavaScriptはフォームのサブミットを行うJavaScriptです。
    このため、サーバーのイベントログを見てPOST要求を行われているのかを確認したのですが、
    POST要求は発生していませんでした。このため、WebBrowserで理由は不明だがJavaScriptが
    処理されず、その結果、POST要求も行われていないと結論づけました。

    なぜ、単独で動作させた場合はWebBrowserはJavaScriptを処理してくれて
    Webサービス経由だとJavaScriptを処理してくれないのかはいまだ謎のままです。。
    2012年5月31日 15:13
  • > サーバーのイベントログを見てPOST要求を行われているのか
    > を確認したのですが

    その前に GET 要求を出すのですよね。それが出ていて、期待さ
    れた応答が返ってきているのでしょうか?

    Fiddler や WireShark などのパケットキャプチャツールを使っ
    て、WebBrowser と Webアプリ(サーバーBに配置)の要求/応答
    をみて、期待した内容になっているのか、どこで止まっているの
    か調べてはいかがでしょう。

    #ログを信用してないみたいですみません。ログでどの程度詳細
     が調べられるのか分りませんが、自分的には、実際にやり取り
     されたパケットの内容を見ないと落ち着かないです。実は、ス
     クリプトが動かないということでなく、ログインできてなくて
     スクリプトがダウンロードされてないのではないかと思ってい
     ます。

    • 回答の候補に設定 山本春海 2012年7月3日 8:24
    2012年6月1日 11:35