機能するもの
およびコンポーネントを使用する DataSnap Web サービスを Delphi-XE2 で構築しました。クライアントはサーバー ( Web サービス) に接続し、DataSnap サーバー メソッドを実行してデータを取得します。サーバーはすべての接続に使用します。スレッド変数にセッション情報を格納しているので、できれば使い続けたい...TDSServer
TDSHTTPService
TDSLifeCycle.Session
Session
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 コードのサンプルを提供できません。