- - PR -
[ASP.NET]WebアプリケーションとWindowsアプリケーションの連携
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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アドレス)のリクエストを識別できません。 こういう場合どのような手法があるでしょうか。よろしくお願いします。 | ||||||||||||
|
投稿日時: 2005-03-01 01:40
こんなスレッドもありますが読みましたか?
ソケットを扱うにはSystem.Net.Sockets以下のクラス達を使うんでしょうね。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemnetsockets.asp
(Webリクエストがあるたびに人が何らかの判断をしてUIでコントロールするとか??) 「リクエストに応じて処理結果を返す」処理をWebアプリで完結させてはだめですか? Windowsアプリはいったい何をしているのかわかりませんが、それはWebアプリでは 不可能なのでしょうか。仮に「既にWindowsアプリの方は存在しているから処理を 共通化しよう」という発想だとしても、保守や機能変更、発生しうる障害なども 考慮すると(個人的には)別で実装するのが正解だと思います。 [ メッセージ編集済み 編集者: べる 編集日時 2005-03-01 01:47 ] | ||||||||||||
|
投稿日時: 2005-03-01 03:28
どもです。がると申します。
んっと…とりあえず「WebアプリとWindowsアプリの共存」に ついてのコメントは避けておきます。 んで。
文章から想定すると ・同一Pageを同一PCから複数開いた際に、それを個々に認識したい という内容か、と思うのですが。 んっと。同一PCからの「別セッション」を認識するのは、かなり難しい かと思います。 HTTPは厳密には「毎Pageごとに別のTCPセッション」であるプロトコル なので(HTTP1.1では連続も可能ですが、連続である保障はないので)。 どうしても区別したいのであれば、Webアプリ上できちんとクライアントが 識別できるような細工をするのが前向きか、とは思うのですが(hiddenに ユニークなIDを埋め込むとか)。 個人的には「設計を見直す」ほうがより楽なのではないかなぁ、とは 思います :-P | ||||||||||||
|
投稿日時: 2005-03-01 07:46
そりゃIPアドレスでは無理でしょう。NATとかProxyとかもあるしね・・・。 ブラウザを区別したいのなら、SessionIDを使うか、Webアプリケーションでブラウザに独自にIDを振る必要があるでしょう。でも今回の例では、別に区別する必要は無いのでは?Windowsアプリケーションから、要求を受けたポートに対して応答を返せばそれで良いのでは無いですか? | ||||||||||||
|
投稿日時: 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.について、何か手段がないでしょうか。 | ||||||||||||
|
投稿日時: 2005-03-01 10:08
今までの回答の中に答えが出てると思いますが・・・。 _________________ 「伝える」とは「人に云う」と書く。 http://d.hatena.ne.jp/NAL-6295/ | ||||||||||||
|
投稿日時: 2005-03-01 10:19
で、WEBアプリはどうやってWindowsアプリからのレスポンスを受け取るの?Socketで受信するのでは無いの?WebアプリSocketで受信するのなら、Windowsアプリは要求を受けたSocketに返信すれば良いのではないの?
多言語をシームレスに繋ぐ事が出来るのも。.NETのメリットの一つです。 C++→C++.NETと言う移植でもコストが問題になるのでしょうか? C++→C++ DLL→P/Invokeで呼び出しでもコストが問題になるのでしょうか? C++アプリをSocket通信に対応させる事は、本当に上記よりコストが少ないのでしょうか?
セッションと言うものがあるでしょ。 でもセッションが識別できたとして、どうやってレスポンスを返すのか謎ですが。 _________________ 甕星 <mikahosi@abox9.so-net.ne.jp> http://blogs.msmvp.jp/mikahosi/ | ||||||||||||
|
投稿日時: 2005-03-01 10:25
私ならば、Windowsアプリの「処理ロジック」を何とか切り出して、 たとえばActiveX DLLのような形式で公開することを考えます。 (この変更はC++だけで完結するはずです。.NET言語に変更する必要はありません) 既存のWindowsアプリに手を入れる必要はありますが、Webアプリとの通信制御を考えると こちらのほうが楽だと思います。 |