我需要在我的 WCF 服务中标识一个 channel 。
一种方法是使用 Session.SessionID,但我似乎无法让绑定(bind)与 session 一起工作,而且 session 对于我想要实现的目标来说似乎太多了。我只是想写下 channel 的历史记录 - 正在调用哪些方法,并保留当前事件的“ channel ID”的哈希值。
如何获得“ channel ID”之类的信息?我知道“ channel ID”并不明确存在,但解决方法是什么?
最佳答案
因为没有其他方法可以解决问题,所以我这样“欺骗”它:
在客户端添加MessageHeader:
using (OperationContextScope scope = new OperationContextScope(cli.InnerChannel))
{
OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("MyHeader", Guid.NewGuid().ToString(), ""));
string ret = cli.GetData(1);
}
在 header 的“名称”属性中,我有要传递的 header 的名称,并且我使用命名空间作为值持有者(因为我似乎无法获得该“值” header 的 - 它没有作为属性公开?!)。每次创建服务实例时,我都会在客户端执行此操作。
在服务中,我阅读标题如下:
var head = OperationContext.Current.IncomingMessageHeaders.FirstOrDefault(h => h.Name == "MyHeader");
string channelId = head.Namespace;
这绝对是一个黑客,但我没有时间创造更优雅的东西,这让我能够以我可以控制的方式维护“ channel ID”……这是一个丑陋的解决方案,我不喜欢它,所以每当有人发现更好的东西时,我都会很感激......
编辑:我尝试使用 Outgoing/IncomingMessageProperties,但这似乎不起作用 - 在服务器端找不到它......我可能遗漏了一些东西......
关于c# - WCF - 如何获得一些 channel 标识符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4244481/