8

私はSOAP1.2を使用してAJAXクライアントによって消費されるWCFサービスを持っています

Web.config:

<endpoint address="" binding="wsHttpBinding" 
contract="WcfService1.IService1" bindingConfiguration="wsHttpBin">

<wsHttpBinding>
  <binding name="wsHttpBin">
    <security mode="None"/>          
  </binding>
</wsHttpBinding>

私が読んだ<security mode="None"/>ことから、「wsHttpBinding」バインディングで公開されたサービスは、WS-*ファミリーのWebサービス仕様のWS-Securityを実装しているため、使用する必要があります。バインディングはセキュリティを使用するため、AJAXはセキュリティコンテキストをサポートしていないため、リクエストは拒否されます。

私のWCFサービスの動作は次のように定義されていInstanceContextMode.PerSessionます:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, 
                 InstanceContextMode = InstanceContextMode.PerSession)]

しかし、私がそれを消費すると、サービスはPerCallとして動作し、すべての呼び出しは現在のインスタンスを使用する代わりに新しいWCFインスタンスを開始します。

wsHttpBindingを使用するときにInstanceContextMode.PerSessionがPerCallのように動作するのはなぜですか?

私に何ができる?

4

2 に答える 2

4

セッションは、HTTPを介して使用される場合、セキュリティセッションまたは信頼できるセッションを使用する場合にのみWCFによってサポートされます。どちらも使用できない場合は、自分でセッションメカニズムを実装する必要があります。クライアント側とサーバー側の両方を制御する場合、それを行うのは非常に簡単です。方法は次のとおりです。

保存する必要のあるすべてのセッションデータ(これを呼びましょう)と、セッションが最後に使用されたときのSessionData追加データを保持するクラスを作成します。DateTime次に、サービスクラス(または他のクラス)にaを追加しますstatic ConcurrentDictionary<string, SessionData>

クライアントがサービスを呼び出すときは、セッションを識別する一意の文字列を渡すように要求します(クライアント側でランダムに生成できます)。クライアントがサービスを呼び出すときはいつでも、辞書でセッション文字列を検索し、セッションデータを取得します(必要に応じてその内容を更新します)。存在しない場合は、ディクショナリに新しいエントリを作成します。また、オブジェクトにアクセスするたびに、「最後に使用した」を現在の時刻SessionDataに更新します。DateTimeバックグラウンドタスクは、しばらく使用されていない古いセッションを定期的にクリアする必要があります。

それだけです-あなたは自分でセッションを実装しました。InstanceContextMode.Singleこれで、WCFを使用して、セッションごとにサービスクラスのインスタンスを正しく作成する必要がなくなりました。

編集:.NET 4.5を使用してWCFサービスを作成していて、Webアプリケーションが最新のブラウザーのみを対象としている場合NetHttpBindingは、サーバー側でWebSocketを使用し、クライアント側でWebSocketを使用できます。NetHttpBindingセッションをサポートします(指定する場合SessionMode.Required)。

于 2012-12-09T16:29:35.413 に答える
0

このリンクは、あなたがこれについて知る必要があるほとんどすべてをあなたに与えます(もちろん一般的に)。

しかし、正確には。MsdnはWCFセッションについて次のように述べています。

それらは、呼び出し元のアプリケーションによって明示的に開始および終了されます

明示的に開いたWCF通信チャネルを保存して「セッション」を維持できるJSコード/フレームワークについては知らないと言わざるを得ません。(あなたはあなたのクライアントコードを提供していないので、私はいくつかの仮定をしなければなりません)。WCFセッションは「Cookieベース」ではありません。ASP.NET Webアプリケーションの場合のように、ブラウザから「そのまま」では機能しません。

設定InstanceContextMode.PerSessionすると、WCFサービスは「セッション対応」になりますが、セッションを「強制」するだけでは不十分です。

于 2012-12-09T16:52:27.987 に答える