WCF - Как получить какой-нибудь идентификатор канала?
Вопрос
Мне нужно определить канал в моей службе WCF.
Один из способов использовать Session.SessiDID, но я не могу, кажется, не могу получить привязку для работы с сеансами, и сессия кажется слишком много для того, что я пытаюсь достичь. Я просто пытаюсь записать историю канала - какие методы называются, и сохранить хеш «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);
}
В свойстве «Имя» заголовка у меня есть имя заголовка, которого я хочу пройти, и я использую пространство имен в качестве держателя Value (так как я не могу добраться до этого значения »заголовка - Это не выставлено как собственность?!). Я делаю это на стороне клиента каждый раз, когда я создаю экземпляр обслуживания.
На сервисе я прочитал заголовок, как:
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()
может удовлетворить вашу цель.