2010-11-22 12 views
2

WCFサービスでチャンネルを識別する必要があります。WCF - チャンネル識別子を取得する方法?

一つの方法は、Session.SessionIDを使用することですが、私はセッションで動作するように結合し得るように見えることができない、とのセッションは私が達成しようとしている何のためにあまりにも多くいるようです。私はちょうどチャンネルの履歴を書き留めようとしています - どのメソッドが呼び出されているのか、そして現在アクティブな "チャンネルID"のハッシュを保持することです。

は、どのように私は「チャネルID」のような何かを得ることができますか?私は 'チャネルID'が明示的に存在しないことを知っていますが、回避策は何ですか?

+0

ユースケースは何ですか、これで何を達成しようとしていますか? –

+0

私が書いたように、チャンネルIDに基づいていくつかの履歴テーブルにログを記録しようとしています。これは、開かれていた各チャンネルでどのメソッドが呼び出されたかを追跡するものです。また、どのチャンネルが開かれているかをトラッキングする方法もあります(これはビジネスロジックの一部です)。 – veljkoz

+0

著者がセッションモードを持っていないと誤解されていない場合、セッションコールバックやその他の情報を取得するためにOperationContext.Currentにアクセスできません。 –

答えて

2

他のトリックは、私はこのようにそれを「だまし」ん何もないので:

は、クライアント側でMessageHeaderを追加します。「名前」で

using (OperationContextScope scope = new OperationContextScope(cli.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("MyHeader", Guid.NewGuid().ToString(), "")); 

    string ret = cli.GetData(1); 
} 

ヘッダーのプロパティには、私が名前を持っています私が渡したいヘッダーの名前空間を値保持者として使用しています(ヘッダーの '値'には見えないので、プロパティとして公開されません)。私はサービスインスタンスを作成するたびにクライアントサイドでこれを行います。サービスで

は、私のようなヘッダ読む:それは間違いなくハックですが、私は何かがより洗練作成に時間外だし、これは私が「チャネルID」の道を維持することができます

var head = OperationContext.Current.IncomingMessageHeaders.FirstOrDefault(h => h.Name == "MyHeader"); 
string channelId = head.Namespace; 

をIそれを制御することができます...それは醜いソリューションだと私はそれを好きではないので、誰かがより良いものを見つけたときに私はそれを感謝...

編集:私は発信/ IncomingMessagePropertiesを使用してみましたが、それは」doesnの私はおそらく何かが欠けているでしょう...

+3

これは、ネームスペースを介してハッキングせずにヘッダー値を取得する方法です。 Guid myChannelID = OperationContext.Current.IncomingMessageHeaders.GetHeader ( "MyHeader"、 "http:// example/my-header /"); –

+0

@velijkov:私のクリスマスはすべて一度に来ました。 ty。 –

0

あなたはstring sessionID = OperationContext.Current.SessionId;を試してみましたか?

+0

私の場合 - 私は本当にセッションを望んでいません。 – veljkoz

+0

セッションを使用していないので、コールバックアドレス、呼び出されたインターフェイス、現在の時刻をログアウトするだけです。それはあなたの後のことですか? –

+0

コールバックアドレスで十分かもしれませんが、ユーザー/チャンネルを有効に識別できるかどうかはわかりませんか?ユーザーがサービスを使用している2つのアプリケーションを持っている場合はどうなりますか? – veljkoz

0

OperationContext.Current.Channel.GetHashCode()があなたの目的に合うかもしれないように聞こえます。

+0

これは、常に各チャンネルに対して同じハッシュ値を返します。これは、私が他のチャンネルと区別するものを持っていないという結論につながります。 – veljkoz

+0

...またはすべてのリクエストが同じチャンネルで処理されていますか?どのバインディングを使用していますか? –

+0

basicHttpBinding - ただし、アプリを再起動しても、チャンネルハッシュは同じままです。 – veljkoz