- PR -

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

投稿者投稿内容
レニー
会議室デビュー日: 2005/02/28
投稿数: 6
投稿日時: 2005-03-01 11:42
SessionIDなるものが使えそうですね。これを試してみます。いろいろとありがとうございます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-01 20:42
引用:

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


 目的が「既存のアプリケーションをWeb上へ移植する」であるなら、『C++からC#/VBへの移植、コードの量からいって、非常に時間がかかる』ことを理由に、そんな設計はしません。
 というより、「サーバ側の処理」、「クライアント側の処理」が明確でないのですけど。

 単純に、元のWindowsアプリケーションを、UIとロジックに分解し、ロジックをDLLとして再編成、P/Invokeで処理ルーチンをサーバ側で呼び出せば、WebアプリケーションとWindowsアプリケーションがソケット通信する必要はないと思います。また、実行されるところを単独のアプリケーション(オブジェクト、インスタンス)にせず、リクエストごとにインスタンスを作るようにすれば、「流用する既存の処理が、どのリクエストに対してレスポンスするのか」という問題も、なくなるのでは?

 少なくとも、Webアプリケーションをしようというなら、UIとロジックの分離が必要です。その分離が曖昧だから、そのような設計になるのではないですか?ということで、設計思想がナンセンスかと思います。

 っつうか、なんでソケット通信?まぁ、.NET Frameworkでドメイン間通信にソケット使うから、それと同じイメージで同じPC(サーバ)内で通信するんだろうけど、パッと見、「サーバとクライアント両方にロジックが実装される」ように読める。

_________________
レニー
会議室デビュー日: 2005/02/28
投稿数: 6
投稿日時: 2005-03-01 21:55
いろいろアドバイスありがとうございます。

引用:
単純に、元のWindowsアプリケーションを、UIとロジックに分解し、ロジックをDLLとして再編成、P/Invokeで処理ルーチンをサーバ側で呼び出せば、WebアプリケーションとWindowsアプリケーションがソケット通信する必要はないと思います。



なるほど、これが正攻法ですね。ですが今回は、既存のWindwosアプリのロジックをDLLにしたりWebアプリに実装するよりも、Webアプリはリクエストを既存のWindowsアプリに渡すだけにして、既存のWindowsアプリで処理を行って結果を返すほうが手間がかからないので、Webアプリはクライアントのリクエストを既存Windowsアプリに渡し、結果をWebコントロールに貼り付けるだけ、にしています。

「既存の処理が、どのリクエストに対してレスポンスするのか」という問題は、Windowsアプリ側にリクエストキューを作って解決しました。

Jittaさんが「 っつうか、なんでソケット通信?」と指摘されていますが、実は、今回のような構成で、WebアプリとWindowsアプリがデータをやりとりする場合にSocket通信以外の手段があるか?というのもみなさんの意見を伺いたい点です。WebアプリとWindowsアプリは同じサーバPC上という前提です。データ量は、リクエストが100バイト程度、処理結果は1レコード100バイト程度で1レコードから数千レコードです。(数千レコード返ってきてもWebアプリは途中で捨ててしまいますが。)

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-03 22:06
引用:

実は、今回のような構成で、WebアプリとWindowsアプリがデータをやりとりする場合にSocket通信以外の手段があるか?というのもみなさんの意見を伺いたい点です。


 ロジックの切り出しを勧めているのは、私だけじゃないですよね?なぜその勧めにしたがわず、通信にこだわるのでしょう?
 とっても不思議なのですが、Windowsアプリケーションはすでにあるもの、なんですよね?そのアプリケーションは、ソケットによって他のアプリケーションと通信する機構を、すでに実装しているのでしょうか?すでに実装してあり、Windowsアプリケーションについてはまったく手を加えなくても良い、というのであれば、そのこだわりもわかります。

 でも、こういう質問をするということは、そうではないわけですよね?Windowsアプリケーションに手を入れて、その辺を実装する必要があるわけですよね?そして、ルートウインドウが表示されていないところで実行できるようなことをしなければならないわけです。または、誰もログインしていないところで実行できるようにしなければいけません。その辺の改造やテストにかかるコストと、Windowsアプリケーションからアプリケーションロジックを切り出してDLL化してテストするコストと、どちらが高く付くでしょう?という検証はされているのでしょうか?


 また、WindowsからWebにUIが変わったように、今後さらにUIが変わる可能性もあると思います。または、ベースとなるOSがLinux系になるかもしれません。そういうことを考えると、Windowsアプリケーションのままにしておくより、ロジックを切り出す方が有益だと思うのですけど?


 そりゃ、今さえ何とかなればいいのかもしれませんが、Windowsアプリケーションもそういう考えで作っていたから、業務ロジックの切り出しが出来ず、ソケット通信をしようなんて考えになっているんじゃないですか?


 その他にも、どれくらいWindowsプログラミングをわかっているのか、計りかねます。例えばこの辺。
引用:

前提)WebアプリではSystem.Net.Socketsを使用して、WindowsアプリとSocket通信しています。
質問)Windowsアプリは処理に数秒かかるので、結果をどのWebアプリインスタンスに返すのかを判断するためにWebアプリが調べたクライアントIPアドレスを使用してみた。


甕星さんが指摘されているとおり、『Socketで受信するのでは無いの?WebアプリSocketで受信するのなら、Windowsアプリは要求を受けたSocketに返信すれば良いのではないの?』
 クライアントからいくらリクエストが来ようと、そのリクエスト1つに付き1つのワークスレッドが、Webアプリケーション内で生成されます。そのワークスレッドが"別々のソケットを使ってWindowsアプリケーションにリクエストを投げる"わけですから、Windowsアプリケーションは処理がシーケンシャルになるか、スレッドをたてれば"Webアプリケーションのリクエストに対応するソケットを持ったスレッドが出来ます"。ということは、結果をどのWebアプリケーションに返すのかという判断は、不要ではないですか?
 この指摘に対する返答はないですよね?
# よく読むと、私の前の投稿そのまま指摘してあるじゃないか

 ん?Windowsアプリケーションは、ソケット通信のサーバですよね?サーバのくせに、通信リクエストの口を一旦捨てて、クライアントとしてWebアプリケーションに接続に行くような作り方をしている?こういうことをやっているなら、質問は理解できるけど、設計が理解できない。。。

_________________
レニー
会議室デビュー日: 2005/02/28
投稿数: 6
投稿日時: 2005-03-04 09:48
Jittaさん、ご返答ありがとうございます。

ロジックの切り出しについて、回答くださったみなさんがそう言っていますが、今回、そう簡単でありません。まず自分の作ったコードではありません。VC++で3万行以上。そして、WebではなくLAN環境でのクライアント-サーバWinSock通信は実装ずみ。という状況で、ロジックを切り出すよりWebアプリとのソケット通信を実装するほうが、手っ取り早いのです。今後、Linuxうんぬんを考慮する必要もありませんし。
実際すでに当初の質問(どのクライアントからのリクエストかを判断するには?)というのは、「Windowsアプリは要求を受けたSocketに返信すれば良い」という当たり前?のことに(そこがよく解ってなかっただけなんですが)立ち返って、解決しております。
コストがどちらが高いかというのは、当然最初から考えており、みなさんがいくら「ロジック切り出し」を薦めようとも、Webアプリ&Windowsアプリの通信方式のほうがコストが掛からない訳でして。事実、もう作業は完了しています。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-04 21:32
引用:

LAN環境でのクライアント-サーバWinSock通信は実装ずみ。

実際すでに当初の質問(どのクライアントからのリクエストかを判断するには?)というのは、「Windowsアプリは要求を受けたSocketに返信すれば良い」という当たり前?のことに(そこがよく解ってなかっただけなんですが)立ち返って、解決しております。


が〜〜〜〜!!!だから、それを最初に書こうよ。

 LAN環境でのソケット通信は実装済、それがわかっていたら、誰も「業務ロジックを切り出せ」なんて言いませんよ。最初からソケット通信だけに的を絞って考えますよ。
 で、いつ解決したんです?それ、報告してないですよね?私、読み落としてます?「解決した」ことを前提に読み返せば、(2005-03-01 21:55)では解決していたらしいと判別されますが、そう書いておいてくれれば私の(2005-03-03 22:06)はなかったんですよ。これ、2日に書いていたのですが、子供の相手をしているうちに寝ちゃって、投稿できなかったんですよ。で、3日はずっと「ああ、どうなっただろう?解決したのかなぁ?遅くなりすぎないうちに考え直せたらいいのになぁ」と、ずっと考えていたんですよ。3日に解決したんだとしても、それ書いていてくれれば、心配する必要もなかったわけです。
 私は、自分のページで「お節介でやっているんだから」と書いているとおり、私自身の作業が無駄になることについては、とやかく言うことはしないつもりです。あなたは「心配してくれ」なんて、一言も言っていませんものね。でもなぁ。これ、2日かけてああでもない、こうでもないと、書き換え、書き換えしていたんですよ。で、解決してるって?私の時間だけが無駄なわけですか。。。

_________________
レニー
会議室デビュー日: 2005/02/28
投稿数: 6
投稿日時: 2005-03-07 09:29
Jittaさん、申し訳ないです。言葉が足りませんでしたね。2005-03-01 21:55 に投稿したこの文章で、解決した事を記したつもりだったのですが、、、
引用:
「既存の処理が、どのリクエストに対してレスポンスするのか」という問題は、Windowsアプリ側にリクエストキューを作って解決しました。



で、ソケット通信はできたので、次に「ソケット通信がよい手段なのか?」という疑問を書き込んだのでしたが、
「読む相手が完全に把握できない表現」だったのかな、と猛省しています。
Jittaさん、余計な時間、心配をおかけしたようで、本当にお詫びいたします。



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