6

NetTcpBinding を使用して WcfService をセットアップしようとしています。大きなファイルを転送するので、転送モードは Streamed を使用します。セッションを使用する必要があり、NetTcpBinding がこれをサポートしていることを読みましたが、オンにすると次のようになります。

SessionMode=SessionMode.Required

エラーが発生します:

System.InvalidOperationException: コントラクトにはセッションが必要ですが、バインディング 'NetTcpBinding' はそれをサポートしていないか、サポートするように適切に構成されていません。

セッションで NetTcpBinding を機能させるために私がしなければならないことを誰かが知っていますか? 助けてくれてありがとう:)

4

1 に答える 1

13

あなたは間違いなくこれを解決しました-しかし、それに遭遇した他の人にとっては(私がしたように)...

Juval Lowy による「Programming WCF Services」によると、SessionMode.Required が構成されたコントラクトでストリーミングを使用することはできません。243ページ参照

また、ストリーミングによる信頼できるメッセージングで NetTcpBinding を使用することもできません。

その理由については詳しく説明されていません。

1 つの回避策は、セッション モードを必要とする操作を別のコントラクトに分割し、ストリーミング操作を別のコントラクトに分割することです。次に、RegisterSession(Guid mySessionId) 操作として非ストリーミング インターフェイスで渡される各クライアントの一意の ID (クライアント アプリの有効期間の一意の GUID) を実装します。サーバー上でセッションが作成されると、GUID と SessionContractImplementation のペアをディクショナリに格納するセッション マネージャー オブジェクトに登録できます。

次に、ストリーミング コントラクト操作 (同じ GUID) にパラメーターを追加して、ストリーミング コントラクトの実装がライブの非ストリーミング オブジェクトにアクセスできるようにします (作成したセッション マネージャーを介して、提供された GUID を使用します)。

もちろん、セッションの有効期間を適切に管理する必要があります。

マイクロソフトから...

セッションとストリーミング 大量のデータを転送する場合、WCF のストリーミング転送モードは、メッセージ全体をメモリ内でバッファリングして処理する既定の動作に代わる実行可能な代替手段です。セッションベースのバインディングで呼び出しをストリーミングすると、予期しない動作が発生する場合があります。すべてのストリーミング呼び出しは、使用されているバインディングがセッションを使用するように構成されている場合でも、セッションをサポートしない単一のチャネル (データグラム チャネル) を介して行われます。複数のクライアントがセッションベースのバインディングを介して同じサービス オブジェクトに対してストリーミング呼び出しを行い、サービス オブジェクトの同時実行モードが single に設定され、そのインスタンス コンテキスト モードが PerSession に設定されている場合、すべての呼び出しはデータグラム チャネルを経由する必要があるため、1 つのみコールは一度に処理されます。1 つまたは複数のクライアントがタイムアウトする場合があります。

注:
この場合、利用可能な「セッション」は 1 つしかないため、MaxConcurrentSessions は効果がありません。

http://msdn.microsoft.com/en-us/library/ms733040.aspxを参照してください。

于 2010-03-16T09:19:14.940 に答える