WCF - どのようにいくつかのチャネル識別子を取得しますか?
質問
私は私のWCFサービスにチャネルを特定する必要があります。
は一つの方法は、Session.SessionIDを使用することですが、私はセッションでの作業への結合を得るように見えることができない、とのセッションは私が達成しようとしている何のためにあまりにも多くいるようです。メソッドが呼び出されているか、そして「チャネルIDの」現在アクティブであることのハッシュを維持するために、
- 私はちょうどチャンネルの歴史を書き留めしようとしています。どのように私は、「チャネルID」のような何かを得ることができますか?私は
?「チャネルIDが」明示的には存在しませんが、回避策は何をしていることを知っています解決
他には何も、私はこのようにそれをトリック「だまされない」んのでます:
クライアント側でMessageHeaderを追加します:
using (OperationContextScope scope = new OperationContextScope(cli.InnerChannel))
{
OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("MyHeader", Guid.NewGuid().ToString(), ""));
string ret = cli.GetData(1);
}
ヘッダの「名前」プロパティでは、私は私が渡したいヘッダーの名前を持っている、と私はその「値」にように見えることはできませんので、私は(値-ホルダーとして名前空間を使用していますヘッダ - それは、プロパティとして公開されていません!)。私はクライアント側で私はサービスインスタンスを作成するたびにこれを行います。
サービスでは、私はのようなヘッダを読みます:
var head = OperationContext.Current.IncomingMessageHeaders.FirstOrDefault(h => h.Name == "MyHeader");
string channelId = head.Namespace;
これは間違いなくハックですが、私はよりエレガントなものを作成するための時間のうちだし、これは私が「チャネルID」私はそれを制御することができる方法を維持することができます...それは醜いソリューションだと私は好きではありませんそれなので、誰かが良く、私はそれを感謝したい何かを見つけた時はいつでも...
の編集の:私は発信/のIncomingMessagePropertiesを使用してみましたが、それが動作するようには思えない - それはどこにもいない...私はおそらく何かが欠けているサーバー側で発見される...
他のヒント
あなたはstring sessionID = OperationContext.Current.SessionId;
を試してみましたか。
それはあなたの目的に合うかもしれないOperationContext.Current.Channel.GetHashCode()
のように聞こえます。