どのような作品
私はDataSnapを作りました ウェブサービス Delphi-XE2では、 TDSServer
そして TDSHTTPService
コンポーネントクライアントがサーバーに接続します(ウェブサービスDataSnapサーバーメソッドを実行してデータを取得します。サーバーは TDSLifeCycle.Session
すべての接続に対して使い続けたい Session
可能であれば、セッション情報をスレッド変数に格納しています。
私 できる への認証にはInternet Explorerを使用します。DataSnapサーバーからデータを取得します。 IEを30秒間アイドル状態にしない(またはサーバーから切断する)と、メソッド要求ごとに同じ接続が再利用されます。
私 できる DataSnapサーバーに接続するためにTIdHTTPを使用する簡単なDelphiアプリを使用してください。追加中 keep-alive
その Request.Connection
プロパティは、接続を維持します 永遠に そして再利用 1 すべてのメソッド呼び出しに対する接続
.
問題
DataSnapサービスにアクセスするためのサードパーティ会社がWCFアプリケーションを構築しています。彼らはWCFアプリを使うことができません 唯一 サービスへの接続最初の認証要求と1番目のメソッド呼び出しは同じ接続を使用しますが、後続の要求は新しい接続を作成します。 netstat
自分のコンピュータ上で新しいESTABLISHEDを見て複数の送信元ポートを使用して、自分のアプリから私のサービスへの接続。新しい接続によってDataSnapサーバーに新しいスレッドが作成され、認証されたスレッドのセッション変数にアクセスできなくなります。
.
考えられる回避策
DataSnapサーバーを Invocation
モデル、維持することを不必要にすること 1 クライアントごとの持続的接続。必要に応じてこれを行います。そうする前に、私は誰か他の人が問題を解決する方法を知っているかどうかを見るのが賢明だと思いました。
.
私の質問
WCFクライアントアプリが作成することは可能ですか?新しい接続を作成せずにすべてのメソッド呼び出しに使用する、非WCFサーバー(DataSnapサーバー)への単一の永続的接続これはどのように行われますか? Visual StudioでC#WCFプロジェクトに正しい[装飾]を追加するのと同じくらい簡単ですか。
どんな提案も大歓迎です!
.
参考:私はサードパーティのコードにアクセスできないので、WCFコードのサンプルを提供することはできません。
回答:
回答№1は0あなたのDelphiアプリケーションは、(セッション変数を使って)ステートフルWebサービスを提供します。 WCF WebサービスはデフォルトでステートレスですWCFクライアントを含みます。
多分 この答え 正しい設定を指している(wsHttpBinding そして SessionMode ServiceContractの
MSDNの説明から:
たとえば、SessionModeプロパティが SessionMode.RequiredとInstanceContextModeプロパティが PerSession、クライアントは 同じ関係 繰り返し電話をかける 同じサービスオブジェクトに。
(私が強調表示します)
ただし、DataSnapは主に設計されていないためWCFとの相互運用性のために、ステートフルではなくステートレスWebサービスモデルを使用するようにDelphi側を再設計する方が簡単かもしれません。これにはすべてのサービスリクエストでの認証が必要ですが、内部的にはDelphi Webサービスは現在のセッション状態と同様にデータをキャッシュしてルックアップ時間を短縮することができます。