WCF - как получить идентификатор канала? - PullRequest
2 голосов
/ 22 ноября 2010

Мне нужно идентифицировать канал в моей службе WCF.

Один из способов - использовать Session.SessionID, но я не могу получить привязку для работы с сессиями, и сессия кажется слишком большойза то, что я пытаюсь достичь.Я просто пытаюсь записать историю канала - какие методы вызываются, и сохранить хэш "идентификаторов каналов", которые в данный момент активны.

Как получить что-то вроде "идентификатора канала"?Я знаю, что «идентификатор канала» не существует явно, но каковы обходные пути?

Ответы [ 3 ]

2 голосов
/ 22 ноября 2010

Поскольку больше ничего не помогает, я «обманул» его так:

Добавьте MessageHeader на стороне клиента:

using (OperationContextScope scope = new OperationContextScope(cli.InnerChannel))
{
   OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("MyHeader", Guid.NewGuid().ToString(), ""));

   string ret = cli.GetData(1);
}

В свойстве «Имя» заголовка IУ меня есть имя заголовка, который я хочу передать, и я использую Пространство имен в качестве держателя значения (поскольку я не могу получить это значение заголовка - оно не отображается как свойство ?!).Я делаю это на стороне клиента каждый раз, когда создаю экземпляр службы.

На службе я читаю заголовок как:

var head = OperationContext.Current.IncomingMessageHeaders.FirstOrDefault(h => h.Name == "MyHeader");
string channelId = head.Namespace;

Это определенно хак, но у меня нет временисоздать что-то более элегантное, и это позволяет мне поддерживать «идентификатор канала» так, как я могу его контролировать ... это уродливое решение, и мне это не нравится, поэтому всякий раз, когда кто-то находит что-то лучшее, я ценю это ...

edit : я пытался использовать Outgoing / IncomingMessageProperties, но, похоже, это не работает - его нигде нет на стороне сервера ... Я, наверное, что-то упустил ...

0 голосов
/ 22 ноября 2010

Звучит так, будто OperationContext.Current.Channel.GetHashCode() может соответствовать вашим целям.

0 голосов
/ 22 ноября 2010

Вы пробовали string sessionID = OperationContext.Current.SessionId;?

...