2012-12-06 5 views
8

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

のWeb.config使用してAJAXクライアントによって消費WCFサービスがあります。私はread持っているものから

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

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

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

私のWCFサービスの動作はInstanceContextMode.PerSessionで定義されます。

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

が、私はそれを消費するとき、PerCallおよびすべてのコールなどのサービス振る舞いではなく、現在のインスタンスを使用しての新しいWCFのインスタンスを起動します。

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

どうすればよいですか?

+0

可能な複製:http://stackoverflow.com/questions/4767102/wcf-sessions-with-a-wshttpbinding-and-without-windows-security – ErnieL

+0

@ErnieLありがとうございますが、自分のAJAXクライアントでは動作しないので、私にとってはオプションではありません。 –

+0

それ自体では、wsHttpBindingはセッションをサポートしていません。 – ErnieL

答えて

3

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

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

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

これで終わりです。あなた自身でセッションを実装しました。 InstanceContextMode.Singleを使用でき、WCFがセッションごとにサービスクラスのインスタンスを正しく作成することを心配する必要はありません。

EDIT:あなたは.NET 4.5を使用してWCFサービスを書いているし、あなたのWebアプリケーションのみが、現代のブラウザをターゲットにしている場合、あなたはサーバー側でNetHttpBindingを使用してのWebSocketクライアント側ですることができます。 NetHttpBindingはセッションをサポートします(SessionMode.Requiredを指定する場合)。

+0

+1:あなたの提案には間違いがありませんが、プロダクションレディセッションメカニズムを実装するには、考慮すべき事項や注意を払う必要があります。セッションのハイジャック(偶然または目的)、実際のセッションタイムアウトセッション(データ)の永続性/回復力、サーバーが再起動した場合(予定または予定外/クラッシュ)、セッション(データ)の同時変更、複数の同時要求などで意味があります。 –

+0

@ Christian.K:Very本当。私は最後の2つのことがWCFによって全く提供されていないとは思わない。確かにセキュリティは考慮する必要があります。スレッドの安全性に関しては、各クライアントが一意のセッション鍵を生成し、いつでもそのサービスに1回の呼び出しを実行すると仮定しましたが、そうでなければスレッドの安全性と正しさはまた、世話をする必要があります。 –

+0

@AllonGuralnekはInstanceContextModeを使用していません.Singleは私のパフォーマンスに大きな影響を与えますか? –

0

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

しかし正確です。MSDNには、WCFのセッションについてこう述べています。

彼らが明示的に私は、私はあなたが保存できるようになる任意のJSコード/フレームワークについて知らないことを言わなければならない呼び出す アプリケーション

によって開始および終了されます明示的に開かれたWCF通信チャンネルを使用して、あなたの「セッション」を生かしてください。 (あなたはクライアントコードを提供していないので、私はいくつかの仮定をしなければならない)。 WCFセッションは「Cookieベース」ではありません。 ASP.NET Webアプリケーションと同じように、ブラウザから「すぐに」動作しません。

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

+0

ASP.NETの「Cookieベース」とはどういう意味ですか? を追加して使用することができますか?私は "箱から"のソリューションを持つことができます。 –

関連する問題