問題タブ [wcf-sessions]
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.
.net - 異なるクライアントからの呼び出し間で WCF AuthorizationContext がクリアされない。(前: WCF サービス セッションが実際に終了するのはいつですか?)
単体テストを行っていたところ、WCF で興味深い問題に遭遇しました。を使用するサービスがあり、次のwsHttpBinding
ように構成されています。
サービスの実装は次のとおりです。
ここで行っているのは、操作コンテキストをチェックすることだけです。AuthorizationContext に「X」がない場合は、1 つ追加します。すでに「X」があった場合は、例外アウト。(これは単純なテストとして厳密に設定されています。通常の使用では、これはカスタムの AuthorizationManager と Token Authenticator で発生します)。
基本的に、同じ operationContext と AuthorizationContext 内でメソッドを複数回呼び出すと、例外が発生します。
さて、これが私のテストフィクスチャです。
実行時に何が起こるかを見てみましょう:
- が新規
TestBusinessClient
作成されます。 - を呼び出します
DoWork()
。 DoWork()
に「X」が見つかりませんAuthorizationContext.Properties
。DoWork()
に「X」を追加しAuthorizationContext.Properties
ます。- テスト メソッドは、最初のクライアントを破棄します。
- 新しい秒
TestBusinessClient
が作成されます。 - を呼び出します
DoWork()
。 DoWork()
最後の呼び出しからのプロパティにまだ「X」が見つかります。DoWork()
例外をスローします。
私の質問は次のとおりです。新しいクライアントが同じサービスに接続するときになぜOperationContext
andが強制終了されないのですか? AuthorizationContext
デフォルトでは呼び出し間にセッション コンテキストが使用されることは理解しwsHttpBinding
ていますが、そのセッションはクライアントごとになると思います。クライアントの新しいインスタンスに接続すると、WCF セッションとそのコンテキストがすべて更新されることを期待していました。
誰にも考えやアイデアはありますか?ここでの望ましい結果は、2 つの別々のクライアントによるAuthorizationContext.Properties
への 2 つの呼び出しの間にリセットされることです。DoWork()
更新 1
PerCall
サービスとを設定してみましたPerSession
が、どちらも違いはありませんでした。
また、信頼できるメッセージングのオンとオフを切り替えてサービスを試してみましたが、どちらも何も変わりませんでした。
また、最初の呼び出しと 2 番目の呼び出しで operationContext を保存し、2 つを比較しました。
したがって、操作コンテキストが変更/再作成されたように見えますが、AuthorizationContext
後続の各サービス呼び出しで何かが同じように設定されています。
更新 2
サーバー側のすべてのものは次のとおりです。
健全性チェックとして、次のことを行いました。
- WCF サーバーのインスタンスを開始します (Cassini/統合 VS 2008 サーバーを使用)。
- テスト フィクスチャを への 1 回の呼び出しのみに減らし
DoWork()
ます。 TestDriven.NET
VS 2008 内からテストを実行します。- スタンドアロン GUI ツール
.dll
から同じテストを開き、実行します。NUnit's
最初のテスト実行は成功し、2 回目は失敗します。したがって、これは純粋にサーバー側のようです.2つの異なるプロセスから同じサービス呼び出しを実行すると、最終的に同じAuthorizationContext
.
同じユーザー名で同じドメインにログインしているため、WCF の内部の何かがまだ残っていWindowsAuthentication
て、同じコンテキストを再利用しているのではないかと考え始めています。Auth
私のサービスはカスタムを使用するように設定されていますAuthorizationManager
:
My.Namespace.CustomAuthMgr
拡張する場所ServiceAuthorizationManager
。にブレークポイントを設定するとCustomAuthMgr.CheckAccess()
、最初の呼び出しでoperationContext.ServiceSecurityContext.AuthorizationContext
はクリアになり、2 回目の呼び出しでは、前の呼び出しで入力したものがすべて含まれます。これは、WCF によって実行される私自身のコードの最初のメソッドであるため、承認フェーズの前に何かが my AuthorizationContext
.
アップデート 3
追加情報: いくつかのことを検証するために、サービスの実装を変更して例外をスローしなくなり、代わりに呼び出し回数のカウンターと現在のスレッド ID を返します。
NUnit
次に、 GUIからテストを 1 回実行すると、次のようになります。
次に、GUI を閉じてNUnit
再起動し、テストを再度実行します。
NUnit
次に、 GUI を再び閉じて、TestDriven.NET
Visual Studio 内からテストを実行します。
したがって、クライアントプロセス間で確実に永続化AuthorizationContext
されますが、同じスレッドが各サービス呼び出しを処理するため、AuthorizationContext
単にスレッド静的か何かですか?
いいえ、スレとは関係ありません。Thread.Sleep(10000);
サービスの実装にを追加し、NUnit
一度に 2 つの GUI を実行すると、それぞれ「2」が出力されましたが、スレッド ID が異なりました。
スレッドAuthorizationContext
間でも永続化されています。気の利いた。
.net - WCF: WCF PerSession サービスへの新しい接続を検出する方法は?
InstanceContextMode が PerSession に設定されたセルフホステッド WCF サービスがあります。
ホスト アプリケーションからサービスへの新しいクライアント接続 (セッション) を検出し、その新しいセッション コンテキストを使用して、そのイベントを通じてサービスを監視するにはどうすればよいですか?
何かのようなもの:
そして私のホストアプリケーションからできること:
.net - トランスポートのみのセキュリティで wsHttpBidning を使用して WCF セッションを有効にする方法
現在、basicHttpBindings と SSL を有効にしてデプロイされている WCF サービスがあります。しかし、wcf セッション (asp セッションではない) を有効にする必要があるため、サービスを wsHttpBidnings に移動しましたが、セッションは有効になっていません
設定しました
しかし、私が設定したとき
サービス契約でそれは言う
コントラクトにはセッションが必要ですが、バインディング 'WSHttpBinding' がそれをサポートしていないか、サポートするように適切に構成されていません。
以下はWSHttpBindingの定義です
これで私を助けてください
c# - セッションを使用するようにWCFを構成する際の問題
セッションモードで実行するようにWCFサービスを構成する際に問題が発生しました。テストとして、私はこの簡単なサービスを書きました:
信頼できるセッションフラグを有効にしたデフォルト構成でNet.TCPバインディングを使用しています。私が理解している限り、このようなサービスはセッションモードで問題なく実行されるはずです。ただし、サービスは呼び出しモードごとに実行されます。AddDataを呼び出すたびに、コンストラクターはAddDataを実行する前に呼び出され、Dispose()は呼び出し後に呼び出されます。なぜこれが起こっているのか考えはありますか?おそらく私は何かが欠けていますか?
注:関連しているかどうかはわかりませんが、VS2008を使用してこれを実行しています。
更新:ここで、wcftestclientがクライアントとのセッションを維持していないことに気づきました-おそらくそれは私の問題でした。確かにそれが問題でした。シンプルなコンソールクライアントからサービスに接続すると、サービスが正常に機能することが確認されました。
.net - wsHttpBinding を使用し、Windows セキュリティを使用しない WCF セッション
IIS でホストされ、http トランスポートを使用し、サーバーのメモリに状態を保持する WCF サービスを作成する必要があります。ステートフル サービスが適切でないことは承知していますが、この最後の制約は、サービスをレガシー クライアントで動作させるために必要です。
私の最初の考えは、値を保存するためのasp.netのセッションでした。サービスで asp.net 互換モードを有効にすると、HttpContext にアクセスできるようになりましたが、セッション オブジェクトに配置された値がメモリに保持されませんでした。これは、セッション状態を処理する http モジュールが正しく構成されていなかったことが原因だと思いますが、答えをグーグルで調べたときに、WCF セッションに出くわし、それらを使用する方がよいと考えました。
ただし、WCF セッションは文書化されておらず、サービスに奇妙な一連の前提条件を課しているように見えます。私のニーズに合った構成を見つけることができませんでした。IIS でホストする必要があり、http または https トランスポートを使用する必要があり、クライアントとサーバーが同じドメインの一部ではないため、Windows 認証では応答しません。wsHttpBinding を使用してこれを実行しようとしています。WCF セッションにはセキュリティまたは信頼できるメッセージが必要だと聞いていましたが、 - 標準のバインディングを使用し、サーバーが同じドメインの一部ではない場合、「SecurityNegotiationException The caller」で失敗します。サービスによって認証されませんでした」例外。Windows セキュリティを使用していたので、これはかなり論理的です。
セキュリティ コンプリートを無効にすると、「コントラクトにはセッションが必要ですが、バインディング 'WSHttpBinding' はそれをサポートしていないか、それをサポートするように適切に構成されていません。」で失敗します。</p>
セキュリティを無効にしたまま信頼できるメッセージを有効にすると、「WSHttpBinding がトランスポート セキュリティ (HTTPS) を介した信頼できるセッションをサポートしていないため、バインディングの検証に失敗しました。チャネル ファクトリまたはサービス ホストを開くことができませんでした。メッセージ セキュリティを使用して、HTTP を介した安全で信頼性の高いメッセージングを実現してください。」</p>
トランスポート レベルのセキュリティを有効にしようとしましたが、生成されたエラーに違いはないようです
私に適した構成はありますか? それとも、asp.net セッションを使用する計画に戻る必要がありますか?
wcf - セッションが有効になっている WCF 二重サービスでエラー状態に対処する方法
セッションが有効になっている二重 WCF サービスがあり、クライアントで障害状態の例外を回避しようとしています。
このトピックに関するいくつかの議論を見つけましたが、私が見つけたすべては、クライアント プロキシまたはチャネルを再作成することを示唆しています。非は、セッションが有効な二重サービスに焦点を当てています。
このアプローチの問題点は、サーバーにはクライアントごとに 1 つのセッションがあり、各クライアントにはサービス プロキシ (シングルトン サービス プロキシ) のインスタンスが 1 つしかないことです。二重であるため、クライアント側ではいくつかのオブジェクトがそのサービス インスタンスのイベント (サーバーからクライアントに送信されるメッセージ) をリッスンしています。サービスが障害状態にある場合、それ以上使用することはできません。そのインスタンスを破棄して新しいインスタンスを作成すると、すべてのイベント ハンドラーをこの新しいインスタンスに再度接続するのが難しくなります。
サービスをラップし、オブジェクトがイベントにフックするたびに、ハンドラーをリストに格納する必要があります (サービスが再作成されたときに再フックできるようにするため)。コードが失われているようで、メモリリークしやすい...
すべてのプロキシ インスタンスを破棄せずに、クライアント プロキシ/チャネルを再起動する方法はありますか? (私はVSで生成されたプロキシを使用しています)
何か案は?
ありがとう、MAB
wcf - 同じWCFチャネルまたはセッションで複数のサービス契約を利用する
NetTcpBindingを使用してデュプレックスWCFサービスを作成している最中です。アーキテクチャに関する質問に遭遇しました。答えはわかっていると思いますが、間違っていることを願っています。
私たちのサービスはステートフルであり、NetTcpBindingwithを選択しましたPerSession
InstanceContextMode
。さまざまな理由から、これは私たちが必要としているものです。大きなインターフェイス(操作の大きなブロックが多くのクライアントに適用されない場合)を、操作が論理的にグループ化された複数の小さなインターフェイスに分割しようとしています。単一のサービス実装ですべてのコントラクトを実装するのは簡単ですが、複数のサービスコントラクトで単一のチャネル(または、私の要件では、単一のセッション)を共有できるかどうかはわかりません。これを機能させるには、間違いなくそれができる必要があります。
もちろん、すべてを1つのコントラクトに含めてFaultException
、無効な操作が実行されたときにsをスローすることもできますが、これらを分割して、適用できないコントラクトのエンドポイントを追加することさえできないようにしたいと思います。私が探しているものは可能ですか?
TL; DRバージョン:
私はこれを行うことができる必要があります:
また、クライアントからサービスへの1つのセッションを確立できますが、との両方IServiceA
を使用しIServiceB
ます。
azure - Azure appfabricサービスバスの負荷分散+セッションアフィニティ(スティッキーセッション)
インターネットを検索していましたが、Azureの外部/内部エンドポイントでは不可能であることがわかりました... Windows Azureはどのように負荷分散を実行しますか?
しかし、私が探しているのは、ServiceBusでセッションアフィニティが可能かどうかです。私は自分自身の研究を修正して行っEchoSample
たが、成功しなかった。私が試した結果ws2007HttpRelayBinding
、netTcpRelayBinding
次のようになりました。
System.ServiceModel.CommunicationException:リモートエンドポイントはこのシーケンスを認識しなくなりました。これは、リモートエンドポイントでのアボートが原因である可能性があります。srm:Identifierの値は、既知のシーケンス識別子ではありません。信頼できるセッションに障害が発生しました。
それで、質問:「サービスバスの負荷分散+セッションアフィニティ」を実行することは可能ですか?
c# - SessionChannel の実際の仕組み
この MSDN の記事から、なぜそれを使用する必要があるのか、どのように機能するのかを何度も理解できませんでした。
- セッションを含むデータグラム
- セッションでのリクエストとレスポンス
- セッション付きデュプレックス
私がサービスを持っていると仮定しましょう
このサービスに 2 つのクライアントがあり、それらが同時に setrvice のメソッドをアクティブ化する場合、サービスが他の 1 つの要求を完了するまで一方のクライアントを待機する必要があるのはなぜですか?; PerSession + 2 クライアント = それぞれが ConcurrencyMode.Single を持つ "2" サービス。私の間違いはどこですか?
c# - WPFEndpoint.Addressの変更でCookieが失われます
私はsoapWebサービスに接続するwpfアプリケーションを持っており、このWebサービスの任意の数の場所に接続する必要があるため、ユーザーがテキストボックスにURLを入力できるようにして、Properties.Settingsに保存します。 。次に、Endpoint.AddressをURLに設定します。WebサービスはASP.netセッションを使用してアプリケーションがログインしていることを検証するため、Cookie=trueを許可するようにサービスが設定されていることを除いてすべて機能します。wpfアプリケーションのapp.configのBindingで設定しましたが、何らかの理由でCookieがどこでも管理されていません。Fiddlerを使用すると、サービスからのリターンリクエストでCookieが設定されている場所を確認できますが、クライアントはWebサービスメソッド間でそのCookieを保存/使用していません。
これによりURLは正しく設定されますが、リクエストがCookieを追跡しておらず、このサービスリクエストを送信しているユーザーを識別するために「ASP.NET_Sessionid」Cookieをサービスに送信しているため、Cookieがどこかで失われています。設定時にCookieを取得して管理する方法について誰かアイデアがありますか?ありがとう!