- PR -

[ASP.NET]WebアプリケーションとWindowsアプリケーションの連携

投稿者投稿内容
レニー
会議室デビュー日: 2005/02/28
投稿数: 6
投稿日時: 2005-02-28 22:14
はじめまして。ASP.NET初心者で、この会議室をいろいろと参考にしております。

ASP.NETのWebアプリケーションでクライアントPCからリクエストを受け付けて、常駐しているWindowsアプリケーションにWinsockでリクエストを渡し、結果を受け取ってクライアントPC上に表示することを考えています。

クライアントPC(IE) <--> Webアプリ <--winsockで通信--> Windowsアプリ

Windowsアプリは、WinsockでListen()待ちをしており、リクエストに応じて処理結果を返すのですが、ほぼ同時にリクエストがあることを考慮して、WebアプリでクライアントPCのIPアドレスを取得して、それをWindowsアプリに渡すことにしているのですが、それでは同じクライアント(同じIPアドレス)のリクエストを識別できません。
こういう場合どのような手法があるでしょうか。よろしくお願いします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-01 01:40
引用:
この会議室をいろいろと参考にしております。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19254&forum=7&start=0
こんなスレッドもありますが読みましたか?

引用:
ほぼ同時にリクエストがあることを考慮して、WebアプリでクライアントPCのIPアドレスを取得して、それをWindowsアプリに渡すことにしているのですが、それでは同じクライアント(同じIPアドレス)のリクエストを識別できません。

これはいまいち理解できません。IPで「識別」できるんじゃないですか?

ソケットを扱うにはSystem.Net.Sockets以下のクラス達を使うんでしょうね。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemnetsockets.asp

引用:
ASP.NETのWebアプリケーションでクライアントPCからリクエストを受け付けて、常駐しているWindowsアプリケーションにWinsockでリクエストを渡し、結果を受け取ってクライアントPC上に表示することを考えています。

どういう経緯でこういう設計になってしまったのですか??
(Webリクエストがあるたびに人が何らかの判断をしてUIでコントロールするとか??)
「リクエストに応じて処理結果を返す」処理をWebアプリで完結させてはだめですか?

Windowsアプリはいったい何をしているのかわかりませんが、それはWebアプリでは
不可能なのでしょうか。仮に「既にWindowsアプリの方は存在しているから処理を
共通化しよう」という発想だとしても、保守や機能変更、発生しうる障害なども
考慮すると(個人的には)別で実装するのが正解だと思います。

[ メッセージ編集済み 編集者: べる 編集日時 2005-03-01 01:47 ]
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-03-01 03:28
どもです。がると申します。
んっと…とりあえず「WebアプリとWindowsアプリの共存」に
ついてのコメントは避けておきます。

んで。
引用:

未記入さんの書き込み (2005-02-28 22:14) より:
それでは同じクライアント(同じIPアドレス)のリクエストを識別できません。


文章から想定すると
・同一Pageを同一PCから複数開いた際に、それを個々に認識したい
という内容か、と思うのですが。

んっと。同一PCからの「別セッション」を認識するのは、かなり難しい
かと思います。
HTTPは厳密には「毎Pageごとに別のTCPセッション」であるプロトコル
なので(HTTP1.1では連続も可能ですが、連続である保障はないので)。

どうしても区別したいのであれば、Webアプリ上できちんとクライアントが
識別できるような細工をするのが前向きか、とは思うのですが(hiddenに
ユニークなIDを埋め込むとか)。
個人的には「設計を見直す」ほうがより楽なのではないかなぁ、とは
思います :-P
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-03-01 07:46
引用:

未記入さんの書き込み (2005-02-28 22:14) より:
Windowsアプリは、WinsockでListen()待ちをしており、リクエストに応じて処理結果を返すのですが、ほぼ同時にリクエストがあることを考慮して、WebアプリでクライアントPCのIPアドレスを取得して、それをWindowsアプリに渡すことにしているのですが、それでは同じクライアント(同じIPアドレス)のリクエストを識別できません。


そりゃIPアドレスでは無理でしょう。NATとかProxyとかもあるしね・・・。
ブラウザを区別したいのなら、SessionIDを使うか、Webアプリケーションでブラウザに独自にIDを振る必要があるでしょう。でも今回の例では、別に区別する必要は無いのでは?Windowsアプリケーションから、要求を受けたポートに対して応答を返せばそれで良いのでは無いですか?
レニー
会議室デビュー日: 2005/02/28
投稿数: 6
投稿日時: 2005-03-01 10:03
皆さんご意見ありがとうございます。要点を的確に説明するのはむずかしいものですね。
WebアプリではSystem.Net.Socketsを使用して、WindowsアプリとSocket通信しています。
目的は既存のWindowsアプリが行っている処理をインターネットを通して利用するためです。WebアプリにWindowsアプリの処理ロジックを入れるのはC++からC#/VBへの移植、コードの量からいって、非常に時間がかかるため、今回の設計をしています。このような既存のWindowsアプリを利用するWebアプリ設計というのは、わりとみなさん考えることだと思うのですが。

で、もう一度問題点を整理しますと、
1.WebアプリからWindowsアプリへのリクエストはいろいろなクライアントから連続して発生する。
2.Windowsアプリは処理に数秒かかるので、結果をどのWebアプリインスタンスに返すのかを判断するためにWebアプリが調べたクライアントIPアドレスを使用してみた。
3.同一PCやNAT/Proxyなどで同じIPアドレスのクライアントから連続してリクエストが来た場合に、IPアドレスでは識別できない。
4.クライアントのIPアドレスではなく、Webアプリの各インスタンスを識別するものが何かありそうなものだが。。。

という質問であります。

識別できなければ、やはりWindowsアプリ側でFirstIn/FirstOutのキューのようなものをつくってやるしかないと思っていますが、上記4.について、何か手段がないでしょうか。





NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-03-01 10:08
引用:

未記入さんの書き込み (2005-03-01 10:03) より:

識別できなければ、やはりWindowsアプリ側でFirstIn/FirstOutのキューのようなものをつくってやるしかないと思っていますが、上記4.について、何か手段がないでしょうか。




今までの回答の中に答えが出てると思いますが・・・。
_________________
「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-03-01 10:19
引用:

未記入さんの書き込み (2005-03-01 10:03) より:
皆さんご意見ありがとうございます。要点を的確に説明するのはむずかしいものですね。
WebアプリではSystem.Net.Socketsを使用して、WindowsアプリとSocket通信しています。


で、WEBアプリはどうやってWindowsアプリからのレスポンスを受け取るの?Socketで受信するのでは無いの?WebアプリSocketで受信するのなら、Windowsアプリは要求を受けたSocketに返信すれば良いのではないの?
引用:

目的は既存のWindowsアプリが行っている処理をインターネットを通して利用するためです。WebアプリにWindowsアプリの処理ロジックを入れるのはC++からC#/VBへの移植、コードの量からいって、非常に時間がかかるため、今回の設計をしています。このような既存のWindowsアプリを利用するWebアプリ設計というのは、わりとみなさん考えることだと思うのですが。


多言語をシームレスに繋ぐ事が出来るのも。.NETのメリットの一つです。
C++→C++.NETと言う移植でもコストが問題になるのでしょうか?
C++→C++ DLL→P/Invokeで呼び出しでもコストが問題になるのでしょうか?
C++アプリをSocket通信に対応させる事は、本当に上記よりコストが少ないのでしょうか?
引用:

4.クライアントのIPアドレスではなく、Webアプリの各インスタンスを識別するものが何かありそうなものだが。。。


セッションと言うものがあるでしょ。
でもセッションが識別できたとして、どうやってレスポンスを返すのか謎ですが。

_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
kanai
ベテラン
会議室デビュー日: 2004/09/13
投稿数: 98
投稿日時: 2005-03-01 10:25
引用:

WebアプリにWindowsアプリの処理ロジックを入れるのはC++からC#/VBへの移植、コードの量からいって、非常に時間がかかるため、今回の設計をしています。



私ならば、Windowsアプリの「処理ロジック」を何とか切り出して、
たとえばActiveX DLLのような形式で公開することを考えます。
(この変更はC++だけで完結するはずです。.NET言語に変更する必要はありません)

既存のWindowsアプリに手を入れる必要はありますが、Webアプリとの通信制御を考えると
こちらのほうが楽だと思います。

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