WCF - 如何获取一些频道标识符?
Posted
技术标签:
【中文标题】WCF - 如何获取一些频道标识符?【英文标题】:WCF - how to get some channel identifier? 【发布时间】:2011-05-13 18:27:41 【问题描述】:我需要在我的 WCF 服务中标识一个频道。
一种方法是使用 Session.SessionID,但我似乎无法让绑定与会话一起使用,而且会话对于我想要实现的目标来说似乎太多了。我只是想写下频道的历史记录——调用了哪些方法,并保留当前处于活动状态的“频道 ID”的哈希值。
如何获得“频道 ID”之类的信息?我知道“频道 ID”并不明确存在,但有什么解决方法?
【问题讨论】:
用例是什么,你想用这个实现什么?? 正如我所写的 - 我正在尝试根据频道 ID 记录一些历史记录表,以跟踪每个频道在打开时调用的方法。此外,有一种方法可以跟踪打开了哪些渠道(用于某些业务逻辑)。 如果我没记错的话作者没有 SessionMode 所以他不能访问 OperationContext.Current 来检索会话回调或任何其他信息。 如果您正在寻找 IP,请尝试查看:nayyeri.net/detect-client-ip-in-wcf-3-5 【参考方案1】:由于没有其他方法可以做到这一点,我就这样“欺骗”了它:
在客户端添加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”......这是一个丑陋的解决方案,我不喜欢它,所以每当有人找到更好的东西时,我会很感激......
edit:我尝试使用 Outgoing/IncomingMessageProperties 但这似乎不起作用 - 在服务器端找不到它...我可能遗漏了一些东西...
【讨论】:
这是在不通过命名空间破解的情况下获取标头值的方法:Guid myChannelID = OperationContext.Current.IncomingMessageHeaders.GetHeader听起来OperationContext.Current.Channel.GetHashCode()
可能适合您的目的。
【讨论】:
这总是为每个通道返回相同的哈希值。这使我得出结论,该频道与其他频道没有任何区别。 ... 或者您的所有请求都在同一个频道上得到处理?你用的是什么绑定? basicHttpBinding - 但即使我重新启动应用程序,通道哈希仍然保持不变。 从您的回答看来,我误解了您原来的问题:当您说“通道”时,我以为您指的是服务器端通道,但您的意思似乎是客户端通道,即客户端代理实例。 【参考方案3】:你试过string sessionID = OperationContext.Current.SessionId;
吗?
【讨论】:
如果没有会话,则不存在,这是我的情况 - 我真的不想要会话。 由于您没有使用会话,您所能做的就是记录回调地址、调用的接口和当前时间。这就是你所追求的吗? 回调地址就足够了,但我不确定它是否能有效地识别用户/频道?如果用户有两个应用程序正在使用该服务怎么办?没有办法区分它们 两个应用不能有相同的回调地址 你是对的(抱歉匆忙发表评论)。但是,回调需要双重绑定吗?我有单向绑定,例如 wsHttpBinding 或 basicHttpBinding...以上是关于WCF - 如何获取一些频道标识符?的主要内容,如果未能解决你的问题,请参考以下文章