3

機能するもの

およびコンポーネントを使用する DataSnap Web サービスを Delphi-XE2 で構築しました。クライアントはサーバー ( Web サービス) に接続し、DataSnap サーバー メソッドを実行してデータを取得します。サーバーはすべての接続に使用します。スレッド変数にセッション情報を格納しているので、できれば使い続けたい...TDSServerTDSHTTPServiceTDSLifeCycle.SessionSession

Internet Explorerを使用して、DataSnap サーバーの認証とデータの取得を行うことができます。IE を 30 秒間アイドル状態にしない (またはサーバーから切断する) と、すべてのメソッド要求に対して同じ接続が再利用されます。

TIdHTTP を使用して DataSnap サーバーに接続する単純な Delphi アプリを使用できますkeep-aliveそのRequest.Connectionプロパティに追加すると、永久に接続されたままになり、すべてのメソッド呼び出しに対して1 つの接続が再利用されます。

.

問題

サード パーティの会社が、DataSnap サービスにアクセスするための WCF アプリを構築しています。サービスへの接続を1 つだけ使用するように WCF アプリを取得することはできません。最初の認証リクエストと最初のメソッド呼び出しは同じ接続を使用しますが、後続のリクエストは新しい接続を作成します。これnetstatは、コンピューターで実行し、複数のソース ポートを使用してアプリからサービスへの新しい ESTABLISHED 接続を確認することから明らかです。新しい接続は、認証されたスレッドのセッション変数にアクセスできない DataSnap サーバーに新しいスレッドを作成します。

.

考えられる回避策

Invocation私は、DataSnap サーバーをモデルに変更できることを知っています。これにより、クライアントごとに1 つの永続的な接続を維持する必要がなくなり、必要に応じてこれを行います。そうする前に、他の誰かが問題を解決する方法を知っているかどうかを確認するのが賢明だと思いました。

.

私の質問

WCF クライアント アプリが、新しい接続を作成せずに、すべてのメソッド呼び出しに使用する非 WCF サーバー (DataSnap サーバー) への単一の永続的な接続を作成することは可能ですか? これはどのように行われますか?Visual Studio の C# WCF プロジェクトに適切な [装飾] を追加するのと同じくらい簡単ですか?

どんな提案でも大歓迎です!

.

参考までに、私はサードパーティのコードにアクセスできないため、WCF コードのサンプルを提供できません。

4

1 に答える 1

0

Delphiアプリケーションは(セッション変数を使用して)ステートフルWebサービスを提供し、WCFWebサービスはデフォルトでステートレスです(WCFクライアントを含む)。

たぶん、この答えは正しい構成( ServiceContractのwsHttpBindingSessionMode)を示しています。

MSDNの文書から:

たとえば、SessionModeプロパティがSessionMode.Requiredに設定され、InstanceContextModeプロパティがPerSessionに設定されている場合、クライアントは同じ接続を使用して同じサービスオブジェクトを繰り返し呼び出すことができます。

(私が強調表示)


ただし、DataSnapは主にWCFとの相互運用性を目的として設計されていないため、ステートフルではなくステートレスWebサービスモデルを使用するようにDelphi側を再設計する方が簡単な場合があります。これには、すべてのサービスリクエストでの認証が必要ですが、Delphi Webサービスは、現在のセッション状態と同様に、内部的にデータをキャッシュしてルックアップ時間を短縮することができます。

于 2012-06-28T10:57:51.010 に答える