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("MyHeader", "example/my-header/"); @velijkov:我所有的圣诞节'一下子就到了。泰。【参考方案2】:

听起来OperationContext.Current.Channel.GetHashCode() 可能适合您的目的。

【讨论】:

这总是为每个通道返回相同的哈希值。这使我得出结论,该频道与其他频道没有任何区别。 ... 或者您的所有请求都在同一个频道上得到处理?你用的是什么绑定? basicHttpBinding - 但即使我重新启动应用程序,通道哈希仍然保持不变。 从您的回答看来,我误解了您原来的问题:当您说“通道”时,我以为您指的是服务器端通道,但您的意思似乎是客户端通道,即客户端代理实例。 【参考方案3】:

你试过string sessionID = OperationContext.Current.SessionId;吗?

【讨论】:

如果没有会话,则不存在,这是我的情况 - 我真的不想要会话。 由于您没有使用会话,您所能做的就是记录回调地址、调用的接口和当前时间。这就是你所追求的吗? 回调地址就足够了,但我不确定它是否能有效地识别用户/频道?如果用户有两个应用程序正在使用该服务怎么办?没有办法区分它们 两个应用不能有相同的回调地址 你是对的(抱歉匆忙发表评论)。但是,回调需要双重绑定吗?我有单向绑定,例如 wsHttpBinding 或 basicHttpBinding...

以上是关于WCF - 如何获取一些频道标识符?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何重新打开失败的 WCF 频道?

如何获取 YouTube 频道名称?

如何获取 WCF Web 服务请求的 XML SOAP 请求?

YouTube API:如何通过频道名称获取频道 ID?

如何获取特定频道 discordjs 的最后一条消息

如何同时获取多个频道历史记录?