WCF - Как получить какой-нибудь идентификатор канала?

StackOverflow https://stackoverflow.com/questions/4244481

  •  27-09-2019
  •  | 
  •  

Вопрос

Мне нужно определить канал в моей службе 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() может удовлетворить вашу цель.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top