我需要在我的 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;
这绝对是一个 hack,但我没有时间创造更优雅的东西,这让我能够以我可以控制的方式维护“频道 ID”......这是一个丑陋的解决方案,我不喜欢它,所以每当有人发现更好的东西时,我都会感激...
编辑:我尝试使用 Outgoing/IncomingMessageProperties 但这似乎不起作用 - 在服务器端找不到它......我可能错过了一些东西......
听起来OperationContext.Current.Channel.GetHashCode()
可能适合您的目的。
你试过了string sessionID = OperationContext.Current.SessionId;
吗?