問題タブ [durable-duplex]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
wcf - WCFデュプレックスチャネル、要求と応答の分離
私は、SOAP Webサービスの「非同期」モード、「二重」モード、または「コールバック」モードとさまざまに呼ばれるものを使用する必要があるプロジェクトを検討しています。このモードでは、サービスの呼び出し元はSOAPヘッダーで「reply-to」アドレスを提供し、サービスはHTTP応答で呼び出しの出力を返す代わりに、この「reply-to」への個別のHTTP接続を作成します。 "アドレスを指定して、応答メッセージを投稿します。これは通常、次のように、CompositeDuplexBindingを使用してWCFで実現されます。
これにより、呼び出しごとに1つではなく2つのHTTP接続が発生します。1つはクライアントからサービスに、もう1つはサービスからクライアントに戻ります。サービス実装の観点からは、何も変更されません。インターフェイスメソッドを実装するメソッドがあり、要求を受け取って応答を返します。素晴らしい、これは私がほとんど必要としているものです。
私の状況では、リクエストとレスポンスは数分から数日まで何でも分けることができます。要求と応答を分離し、後で応答するのに十分な情報が得られるまで(または、特定の状況では決して応答しないまで)状態(メッセージ、応答URIなど)を「保存」する方法が必要です。
必要なばかげたタイムアウト値(有効なものとして受け入れられている場合でも)とともに、メソッドを一度に最大数日間基本的に「一時停止」することにそれほど興奮していませんが、どうすればよいかわかりません。このようなシステムを組み合わせます。
完全に明確にするために、私は標準化団体によって提供される一連の標準を実装しているので、SOAPメッセージのセマンティクスを変更したりプロトコルの実装を変更したりする柔軟性がありません。この種の相互作用は、ReplyToヘッダーがWS-Addressingに実装されたときに意図されていたものとまったく同じです。
どうしますか?おそらく、Workflow Foundationはこの種のことを可能にしますか?
tcp - KeepAlive() メソッドを使用せずに TCP を使用した耐久性のあるデュプレックス
イベント通知のために、長持ちする TCP 二重接続を実装する必要があります。クライアントはイベントを登録し、サーバーはこのイベントについてすべてのサブスクライバーに通知します。
問題は、TCP 接続が 10 分後に閉じられることです。私は信頼できるセッションについて知っています。クローズおよび非アクティブ タイムアウト。
私が必要とするのは、クライアントとサーバーの間にある種の「常に開かれた接続」を実装することです。クライアントは、接続が失われたことに気付くとすぐに再接続します。ただし、TCP で接続しているときに一部の接続が失われることに気付くのは難しい場合があります。
長い受信タイムアウトと非アクティブ タイムアウトを使用して、ある種のソリューションを発明することができました。サーバーがまだオンラインで、ある種の KeepAlive() メソッドを使用して接続されている場合、クライアントは短い間隔でサーバーを「パルス チェック」します。
サービス コントラクトに KeepAlive() メソッドを使用せずにソリューションを提供したいと考えています。
何か案は?
//ミロ
wcf - WCFデュプレックスnettcpチャネルのASAP初期化
クライアント/サーバーアプリケーションでは、サーバーとの通信に単一のデュプレックスWCFチャネルを使用できるようにする必要があります。これは、クライアントアプリケーションの実行に厳密には必要ではないが、サーバーにステータスを報告するために望ましいバックグラウンド接続の一種です。 。とにそれぞれPing()
呼び出しとEcho()
コールバックがIServerContract
ありIClientContract
ます。
class ServerProxy : System.ServiceModel.DuplexClientBase<IServerContract>
パススルーメソッドを使用して実装しbase.InnerChannel
ます。
var proxy = new ServerProxy(...)
クライアントで作成した場合、呼び出しproxy.Ping()
を開始するだけで、WCFは最初の呼び出しの接続を自動的に開き、直後に操作呼び出しを実行します。ただし、チャネルの初期化と認証のため、最初の呼び出しには常に最大10秒かかります。(私はWindows認証、メッセージベースのセキュリティ、EncryptAndSignを使用しています。)後続の呼び出しはより高速です。
この10秒は避けられないと思いますが、通常、クライアントがサーバーを最初に呼び出す前に、この初期化が行われる可能性がある時間があります。そのため、の自動オープン機能を待つのではなく、DuplexClientBase
への呼び出しでチャネルを早期に開きますproxy.InnerDuplexChannel.Open()
。(proxy.Open()
例外をスローし、この間接参照はそれを回避しているようです。)
残念ながら、クライアントからサーバーへのチャネルを認証しても、サーバーからクライアントへのコールバックチャネルは認証されません。代わりに、サーバーからクライアントへの最初の呼び出しにも約10秒かかります。私はnetTcpバインディングを使用しているので、これには驚いていますが、今のところ予想されていると思います。
コールバックチャネルをプリエンプティブに開くにはどうすればよいですか?
代わりにクライアントに何らかのメソッドを呼び出すように要求することもできますが、Login()
ユーザーコードが接続されたクライアントを認識できるようになる前に、WCFが厳密に操作を要求する必要があるとは思いません。
ヒント(?):このコードは、WCFパイプライン/ライフサイクルの中で、サーバーがクライアントに接続されたイベントに対して(および操作メッセージが送信される前に)カスタムアクションを実行する機会がある場所に配置する必要があると思います。この統合ポイントは、これまでのところ私にはわかりませんでした。
.net - .NET ベースのプッシュ通知サービス
.net に基づくプッシュ通知のスケーラブルなソリューションを探しています。
シナリオ:
クライアントとサーバーの両方が .NET になります。要件は、1 つのサーバーに約 60 から 100 のクライアントが接続され、サーバーがクライアントごとに毎分 4000 から 5000 の通知を送信できる必要があることです。すべての通知にも小さなペイロードがあります。
何か案は?