Прочитать на английском

Поделиться через


OperationContextScope Класс

Определение

Создает блок, в котором объект OperationContext является областью.

public sealed class OperationContextScope : IDisposable
Наследование
OperationContextScope
Реализации

Примеры

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

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Threading;

public class Client : ISampleServiceCallback
{
  ManualResetEvent wait = null;

  Client()
  {
    this.wait = new ManualResetEvent(false);
  }

  public static void Main()
  {
    Client client = new Client();
    client.Run();
  }

  void Run()
  {
    // Picks up configuration from the config file.
    SampleServiceClient wcfClient = new SampleServiceClient(new InstanceContext(this));
    try
    {
      using (OperationContextScope scope = new OperationContextScope(wcfClient.InnerChannel))
      {
        MessageHeader header
          = MessageHeader.CreateHeader(
          "Service-Bound-CustomHeader",
          "http://Microsoft.WCF.Documentation",
          "Custom Happy Value."
          );
        OperationContext.Current.OutgoingMessageHeaders.Add(header);

        // Making calls.
        Console.WriteLine("Enter the greeting to send: ");
        string greeting = Console.ReadLine();

        //Console.ReadLine();
        header = MessageHeader.CreateHeader(
            "Service-Bound-OneWayHeader",
            "http://Microsoft.WCF.Documentation",
            "Different Happy Value."
          );
        OperationContext.Current.OutgoingMessageHeaders.Add(header);

        // One-way
        wcfClient.Push(greeting);
        this.wait.WaitOne();

        // Done with service.
        wcfClient.Close();
        Console.WriteLine("Done!");
        Console.ReadLine();
      }
    }
    catch (TimeoutException timeProblem)
    {
      Console.WriteLine("The service operation timed out. " + timeProblem.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (CommunicationException commProblem)
    {
      Console.WriteLine("There was a communication problem. " + commProblem.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
  }


  #region ISampleServiceCallback Members

  public void PushBack(string msg)
  {
    Console.WriteLine("Service said: " + msg);
    this.WriteHeaders(OperationContext.Current.IncomingMessageHeaders);
    this.wait.Set();
  }

  void WriteHeaders(MessageHeaders headers)
  {
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("IncomingHeader:");
    Console.ForegroundColor = ConsoleColor.Blue;
    foreach (MessageHeaderInfo h in headers)
    {
      if (!h.Actor.Equals(String.Empty))
        Console.WriteLine("\t" + h.Actor);
      Console.ForegroundColor = ConsoleColor.White;
      Console.WriteLine("\t" + h.Name);
      Console.ForegroundColor = ConsoleColor.Blue;
      Console.WriteLine("\t" + h.Namespace);
      Console.WriteLine("\t" + h.Relay);
      if (h.IsReferenceParameter)
      {
        Console.WriteLine("IsReferenceParameter header detected: " + h.ToString());
      }
    }
    Console.ResetColor();
  }
  #endregion
}

Комментарии

Класс OperationContextScope используется для создания области для определенного объекта OperationContext или области для нового OperationContext объекта с помощью указанного объекта IContextChannel. Можно OperationContextScope использовать в службе Windows Communication Foundation (WCF) или клиентском приложении WCF.

После создания контекста текущей операции объектом OperationContextScope, контекст OperationContext можно использовать для следующих целей.

  • Просмотр и изменение заголовков и других свойств входящих и исходящих сообщений.

  • Доступ к среде выполнения, в том числе к диспетчерам, основному приложению, каналу и расширениям.

  • Доступ к другим типам контекстов, например к контексту безопасности, контексту экземпляра и контексту запросов.

  • Доступ к каналу, связанному с объектом OperationContext или (если в канале реализован сеанс System.ServiceModel.Channels.ISession) с идентификатором сеанса соответствующего канала.

При создании области OperationContextScope текущий контекст сохраняется OperationContext, и новый контекст OperationContext выводится свойством Current. Когда область OperationContextScope удаляется, восстанавливается исходный контекст OperationContext.

Предупреждение

Не используйте асинхронный шаблон await в блоке OperationContextScope. При продолжении оно может выполняться в другом потоке, а операция OperationContextScope зависит от потока. Если необходимо вызвать "await" для асинхронного вызова, используйте его за пределами блока OperationContextScope.

Конструкторы

OperationContextScope(IContextChannel)

Инициализирует новый экземпляр класса OperationContextScope, использующего указанный канал IContextChannel для создания нового контекста OperationContext для области действия.

OperationContextScope(OperationContext)

Инициализирует новый экземпляр класса OperationContextScope для создания области для указанного объекта OperationContext.

Методы

Dispose()

Восстанавливает первоначальный контекст OperationContext в активное состояние и удаляет объект OperationContextScope.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к

Продукт Версии
.NET Core 1.0, Core 1.1, 8 (package-provided), 9 (package-provided), 10 (package-provided)
.NET Framework 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0 (package-provided)
UWP 10.0