WCF はファイアウォール経由でクライアントにプッシュされますか?[閉まっている]
質問
こちらも参照 WCF サーバーはどのように通知しますか 変更に関するWCFクライアント?(ベター 解決策、次に単純なポーリング、例えばコメントまたはロングポーリング)
クライアント ファイアウォールを介して WCF でプッシュ テクノロジを使用する必要があります。これは一般的な問題に違いありません。実際、理論的には機能することはわかっていますが (以下のリンクを参照)、実際に機能させることはできませんでした。また、それを実証するコード サンプルも見つかりませんでした。
要件:
- WCF
- クライアントは、TCP ポート 80 (netTcpBinding) を介してサーバーに接続します。
- サーバーは不定期 (1 分から数時間) で情報をプッシュバックします。
- ユーザーはファイアウォールを構成する必要はありません。サーバーのプッシュは、すべての受信ポートが閉じられているファイアウォールを通過する必要があります。これには同じ接続上の TCP デュプレックスが必要ですが、クライアント ファイアウォールでポートを開く必要があるため、デュアル バインディングは機能しません。
- クライアントは定期的な間隔 (おそらく 15 分ごと) でサーバーにハートビートを送信するため、サーバーはクライアントがまだ生きていることを認識します。
- サーバーはWASを備えたIIS7です。
解決策は duplex netTcpBinding のようです。この情報に基づいて、次のようになります。
しかし、機能するコードサンプルはまだ見つかりません。Microsoft の WCF サンプルの「Duplex」サンプルと「TcpActivation」サンプルを組み合わせてみましたが、うまくいきませんでした。誰かが動作するサンプルコードを教えてくれるか、小さなサンプルアプリを構築してもらえますか。どうもありがとう!
解決
いくつかの解決策を見つけました。
ゼロシーアイス 商用オプション付きの GPL。簡単にテストしただけです。.NET Remoting よりも強力に見え、非常に活発に開発されています。
レムオブジェクト 商用の積極的な開発はすべてをサポートしていますが、AuthenticChannels が使用する高度な機能をすべて備えているわけではないようです。
本物のチャンネル. 。これは、多くの優れた追加機能を備えたリモート処理を使用します。最も重要な機能は、クライアントのファイアウォールを開く必要がなく、NAT を介して機能することです。残念ながらもう亡くなってしまったようです。
この記事によると、もう 1 つの解決策は、IIS でストリーミングを使用することです。 IIS で接続を開いたままにする
クライアントはポート 80 でサーバーへの最初の接続 (IIS6 では http、IIS7 では tcp) を確立します。その後、接続は終了しないストリーミング応答で開いたままになります。
これを実験する時間がありませんでした。また、ファイアウォールの問題を具体的に解決するというサンプルも見つかりませんでしたが、おそらく機能する優れたサンプルを以下に示します。 ストリーミング XML.
他のヒント
調べてみましたか: http://www.codeproject.com/KB/WCF/WCF_Duplex_UI_Threads.aspx
あなたがすでに試みたことの例を挙げていただけますか?ファイアウォールなどの詳細、エラーメッセージは?
クライアントとサーバーの両方を直接アドレス指定でき、ファイアウォールが問題にならない場合は、サポートされているコントラクトを提供する URL をクライアントに登録できるようにすることを検討しましたか。その後、サーバーは必要なときにいつでもこのサービスを呼び出すことができ、長時間実行 (ただし、ほとんどがアイドル状態の接続) を確立する必要がなく、ハートビートの必要性が回避され、セッション/接続全体で回復力を高めることができます。
ほとんどのファイアウォール設定では、TCP 接続がアイドル状態の場合、リソースを節約するためにファイアウォールによって切断されます。アイドル タイムアウトはおそらく制御できるものではありません。アイドル状態でリソース制限に達すると、それらを破棄する人もいます。
ほとんどの企業環境では、どのマシンもアウトバウンド TCP 接続を行うことを許可しません。
また、このメカニズムを使用すると、スケーリングの問題が発生することになります。より信頼できる解決策は、情報をキューに登録し、クライアントに定期的にポーリングしてもらうことだと思います。顧客がプロキシ キャッシュを使用している場合は、後続のクライアント ポーリングでキャッシュされたデータを顧客のプロキシ キャッシュから取得できるように、可能であればキャッシュを利用します。
データをタイムリーにプッシュする必要がある場合、1 秒未満のランド (つまり、金融サービスなど)の場合は、クライアント側の NServiceBus ディストリビュータなどのメッセージング インフラストラクチャを検討してください。ただし、これには顧客によるインストールが必要です...
では、Toredo を使ってみましたか?そこに表示されると読んだところ、ユーザーがセットアップするには複雑すぎる可能性があります。
私はあなたが話しているシナリオを試したことがないので、あまり役に立ちません、申し訳ありません。バイパスする必要があるのがクライアント ファイアウォールだけである場合は、チェックしてみてください。 この郵便受け.
幸運を。
これを試してみましたか?DuplexHttpBinding
カスタム WCF バインディングとしてカプセル化されたスマート ポーリング技術を使用しています。したがって、すぐに使えるはずです。
ファイアウォールが有効なクライアントで二重 Web サービスにアクセスするには、クライアントで次の変更を行うことができます。
- 「ファイアウォール」→「詳細設定」→「設定(ネットワーク接続設定)」→「Webサーバー(Http)」でWebHttpオプションにチェックを入れます。