Заголовки сообщений WCF в OperationContext.Current - PullRequest
4 голосов
/ 08 апреля 2010

Если я использую код, подобный этому [чуть ниже], чтобы добавить заголовки сообщений к своему OperationContext, будут ли все будущие исходящие сообщения содержать эти данные в любом новом ClientProxy, определенном из того же «прогона» моего приложения?

Цель состоит в том, чтобы передать один или два параметра каждому OpeartionContract без сообщения с сигнатурой OperationContract, поскольку передаваемые параметры будут согласованными для всех запросов для данного запуска моего клиентского приложения.

public void DoSomeStuff()
{
    var proxy = new MyServiceClient();
    Guid myToken = Guid.NewGuid();
    MessageHeader<Guid> mhg = new MessageHeader<Guid>(myToken);
    MessageHeader untyped = mhg.GetUntypedHeader("token", "ns");
    OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
    proxy.DoOperation(...);
}

public void DoSomeOTHERStuff()
{
    var proxy = new MyServiceClient();
    Guid myToken = Guid.NewGuid();
    MessageHeader<Guid> mhg = new MessageHeader<Guid>(myToken);
    MessageHeader untyped = mhg.GetUntypedHeader("token", "ns");
    OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
    proxy.DoOtherOperation(...);
}

Другими словами, безопасно ли рефакторинг вышеприведенного кода следующим образом?

bool isSetup = false;
public void SetupMessageHeader()
{
    if(isSetup) { return; }
    Guid myToken = Guid.NewGuid();
    MessageHeader<Guid> mhg = new MessageHeader<Guid>(myToken);
    MessageHeader untyped = mhg.GetUntypedHeader("token", "ns");
    OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
    isSetup = true;
}

public void DoSomeStuff()
{
    var proxy = new MyServiceClient();
    SetupMessageHeader();
    proxy.DoOperation(...);
}

public void DoSomeOTHERStuff()
{
    var proxy = new MyServiceClient();
    SetupMessageHeader();
    proxy.DoOtherOperation(...);
}

Так как я не очень понимаю, что там происходит, я не хочу грузить культ и просто поменять его и позволить ему летать, если он работает, я хотел бы услышать ваши мысли о том, нормально это или нет .

Ответы [ 2 ]

4 голосов
/ 12 июня 2010

Я думаю, что ваш реорганизованный код не имеет никакой дополнительной ценности. Вы учли, что OperationContext может быть нулевым?

Я думаю, что это будет более безопасный подход:

 using(OperationContextScope contextScope =
        new OperationContextScope(proxy.InnerChannel))
  {

      .....
      OperationContext.Current.OutgoingMessageHeaders.Add(untyped); 
      proxy.DoOperation(...); 
  }

Конструктор OperationContextScope всегда будет вызывать замену контекста Operation текущего потока; Вызывается метод Dispose для OperationContextScope, который восстанавливает старый контекст, предотвращая проблемы с другими объектами в том же потоке.

0 голосов
/ 16 июня 2010

Я полагаю, что ваш OperationContext будет стираться при каждом новом прокси.

Вы должны планировать добавление пользовательских заголовков сообщений перед каждым вызовом. В любом случае это хорошая практика, так как вы должны отдавать предпочтение услугам по вызову и закрывать канал после каждого вызова.

Существует несколько шаблонов для управления пользовательскими заголовками.

  1. Вы можете создать заголовок как часть конструктора для прокси.

  2. Кроме того, вы можете расширить привязку с помощью поведения, которое автоматически добавляет пользовательский заголовок перед выполнением каждого вызова. Это хороший пример: http://weblogs.asp.net/avnerk...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...