OperationContext OperationContext OperationContext OperationContext Class

Определение

Предоставляет доступ к контексту выполнения метода службы.Provides access to the execution context of a service method.

public ref class OperationContext sealed : System::ServiceModel::IExtensibleObject<System::ServiceModel::OperationContext ^>
public sealed class OperationContext : System.ServiceModel.IExtensibleObject<System.ServiceModel.OperationContext>
type OperationContext = class
    interface IExtensibleObject<OperationContext>
Public NotInheritable Class OperationContext
Implements IExtensibleObject(Of OperationContext)
Наследование
OperationContextOperationContextOperationContextOperationContext
Реализации

Примеры

В следующем примере кода свойство Current и метод GetCallbackChannel используется для возврата канала вызывающей стороне из метода.The following code example uses the Current property and GetCallbackChannel method to obtain the channel back to the caller from within a method. Все методы в этом примере являются односторонними, позволяя службе и клиенту независимо взаимодействовать в обоих направлениях.All methods in this example are one-way methods, enabling the service and the client to communicate in both directions independently. В этом случае приведенное в качестве примера клиентское приложение ожидает только одного обратного вызова перед выходом, однако другое клиентское приложение, например клиент Windows Forms, может получать любое количество вызовов от службы.In this case, the example client application expects only one return call before it exits, but another client, for example a Windows Forms client, can receive any number of calls from the service.

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(
    Name = "SampleDuplexHello",
    Namespace = "http://microsoft.wcf.documentation",
    CallbackContract = typeof(IHelloCallbackContract),
    SessionMode = SessionMode.Required
  )]
  public interface IDuplexHello
  {
    [OperationContract(IsOneWay = true)]
    void Hello(string greeting);
  }

  public interface IHelloCallbackContract
  {
    [OperationContract(IsOneWay = true)]
    void Reply(string responseToGreeting);
  }

  public class DuplexHello : IDuplexHello
  {
    public DuplexHello()
    {
      Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
    }

    ~DuplexHello()
    {
      Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
    }

    public void Hello(string greeting)
    {
      Console.WriteLine("Caller sent: " + greeting);
      Console.WriteLine("Session ID: " + OperationContext.Current.SessionId);
      Console.WriteLine("Waiting two seconds before returning call.");
      // Put a slight delay to demonstrate asynchronous behavior on client.
      Thread.Sleep(2000);
      IHelloCallbackContract callerProxy
        = OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
      string response = "Service object " + this.GetHashCode().ToString() + " received: " + greeting;
      Console.WriteLine("Sending back: " + response);
      callerProxy.Reply(response);
    }
  }
}


Imports System.Collections.Generic
Imports System.ServiceModel
Imports System.Threading

Namespace Microsoft.WCF.Documentation
    <ServiceContract(Name:="SampleDuplexHello", Namespace:="http://microsoft.wcf.documentation", _
                     CallbackContract:=GetType(IHelloCallbackContract), SessionMode:=SessionMode.Required)> _
  Public Interface IDuplexHello
        <OperationContract(IsOneWay:=True)> _
        Sub Hello(ByVal greeting As String)
    End Interface

  Public Interface IHelloCallbackContract
    <OperationContract(IsOneWay := True)> _
    Sub Reply(ByVal responseToGreeting As String)
  End Interface

  Public Class DuplexHello
      Implements IDuplexHello
    Public Sub New()
      Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
    End Sub

    Protected Overrides Sub Finalize()
      Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
    End Sub

    Public Sub Hello(ByVal greeting As String) Implements IDuplexHello.Hello
      Console.WriteLine("Caller sent: " & greeting)
      Console.WriteLine("Session ID: " & OperationContext.Current.SessionId)
      Console.WriteLine("Waiting two seconds before returning call.")
      ' Put a slight delay to demonstrate asynchronous behavior on client.
      Thread.Sleep(2000)
            Dim callerProxy = OperationContext.Current.GetCallbackChannel(Of IHelloCallbackContract)()
            Dim response = "Service object " & Me.GetHashCode().ToString() & " received: " & greeting
      Console.WriteLine("Sending back: " & response)
      callerProxy.Reply(response)
    End Sub
  End Class
End Namespace

В следующем клиенте для получения сообщения обратного вызова используется команда SampleDuplexHelloCallback.The following client implements the SampleDuplexHelloCallback to receive the callback message. Имя импортированного контракта обратного вызова отличается от имени, используемого в службе, в связи с использованием в предыдущем примере свойства Name.The imported callback contract is not the same name as the one in the service, due to the use of the Name property in the preceding example. Необходимо отметить, что клиент не делает предположения относительно возможности получения обратного вызова. Обратный вызов сервера полностью независим от исходящего вызова клиента.Note that the client makes no assumptions about whether or when it might receive a callback; the server callback is entirely independent of the client's outbound call.

Примечание

Пример, в котором используется класс OperationContext в клиентском сценарии, можно найти в разделе OperationContextScope.For an example that uses the OperationContext class in a client scenario, see OperationContextScope.

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

namespace Microsoft.WCF.Documentation
{
  public class Client : SampleDuplexHelloCallback
  {
    AutoResetEvent waitHandle;

    public Client()
    {
      waitHandle = new AutoResetEvent(false);
    }

    public void Run()
    {
      // Picks up configuration from the config file.
      SampleDuplexHelloClient wcfClient 
        = new SampleDuplexHelloClient(new InstanceContext(this));
      try
      {
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Enter a greeting to send and press ENTER: ");
        Console.Write(">>> ");
        Console.ForegroundColor = ConsoleColor.Green;
        string greeting = Console.ReadLine();
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Called service with: \r\n\t" + greeting);
        wcfClient.Hello(greeting);
        Console.WriteLine("Execution passes service call and moves to the WaitHandle.");
        this.waitHandle.WaitOne();
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.WriteLine("Set was called.");
        Console.Write("Press ");
        Console.ForegroundColor = ConsoleColor.Red;
        Console.Write("ENTER");
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.Write(" to exit...");
        Console.ReadLine();
        wcfClient.Close();
      }
      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();
      }
    }

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

    public void Reply(string response)
    {
      Console.WriteLine("Received output.");
      Console.WriteLine("\r\n\t" + response);
      this.waitHandle.Set();
    }
  }
}

Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.Threading

Namespace Microsoft.WCF.Documentation
  Public Class Client
      Implements SampleDuplexHelloCallback
    Private waitHandle As AutoResetEvent

    Public Sub New()
      waitHandle = New AutoResetEvent(False)
    End Sub

    Public Sub Run()
      ' Picks up configuration from the config file.
      Dim wcfClient As New SampleDuplexHelloClient(New InstanceContext(Me))
      Try
        Console.ForegroundColor = ConsoleColor.White
        Console.WriteLine("Enter a greeting to send and press ENTER: ")
        Console.Write(">>> ")
        Console.ForegroundColor = ConsoleColor.Green
                Dim greeting = Console.ReadLine()
        Console.ForegroundColor = ConsoleColor.White
        Console.WriteLine("Called service with: " & Constants.vbCrLf & Constants.vbTab & greeting)
        wcfClient.Hello(greeting)
        Console.WriteLine("Execution passes service call and moves to the WaitHandle.")
        Me.waitHandle.WaitOne()
        Console.ForegroundColor = ConsoleColor.Blue
        Console.WriteLine("Set was called.")
        Console.Write("Press ")
        Console.ForegroundColor = ConsoleColor.Red
        Console.Write("ENTER")
        Console.ForegroundColor = ConsoleColor.Blue
        Console.Write(" to exit...")
        Console.ReadLine()
        wcfClient.Close()
      Catch timeProblem As TimeoutException
        Console.WriteLine("The service operation timed out. " & timeProblem.Message)
        Console.ReadLine()
        wcfClient.Abort()
      Catch commProblem As CommunicationException
        Console.WriteLine("There was a communication problem. " & commProblem.Message)
        Console.ReadLine()
        wcfClient.Abort()
      End Try
    End Sub

    Public Shared Sub Main()
      Dim client As New Client()
      client.Run()
    End Sub

    Public Sub Reply(ByVal response As String) Implements SampleDuplexHelloCallback.Reply
      Console.WriteLine("Received output.")
      Console.WriteLine(Constants.vbCrLf & Constants.vbTab & response)
      Me.waitHandle.Set()
    End Sub
  End Class
End Namespace

Комментарии

Для доступа к текущей среде выполнения операций из операции службы нужно использовать контекст OperationContext.Use the OperationContext from within a service operation to access the current operation execution environment. Контекст операции используется для доступа к каналам обратного вызова в дуплексных службах, для хранения дополнительных данных о состоянии для разных частей операций, для доступа к заголовкам и свойствам входящих сообщений и для добавления заголовков и свойств в исходящие сообщения.In particular, the operation context is used to access callback channels in duplex services, to store extra state data across portions of the operations, and to access incoming message headers and properties as well as add outgoing message headers and properties.

Дополнительные сведения об использовании расширений для хранения данных о состоянии см. в разделе расширяемые объекты.For more information about using extensions to store state data, see Extensible Objects.

Контекст OperationContext имеет следующие свойства и методы.The OperationContext has the following properties and methods.

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

OperationContext(IContextChannel) OperationContext(IContextChannel) OperationContext(IContextChannel) OperationContext(IContextChannel)

Инициализирует новый экземпляр класса OperationContext, использующий указанный канал IContextChannel в клиентском приложении.Initializes a new instance of the OperationContext class that uses the specified IContextChannel in a client application.

Свойства

Channel Channel Channel Channel

Получает канал, связанный с текущим объектом OperationContext.Gets the channel associated with the current OperationContext object.

ClaimsPrincipal ClaimsPrincipal ClaimsPrincipal ClaimsPrincipal

Получает субъект требований, связанный с операцией.Gets the claims-based principal associated with the operation.

Current Current Current Current

Возвращает или задает контекст выполнения текущего потока.Gets or sets the execution context for the current thread.

EndpointDispatcher EndpointDispatcher EndpointDispatcher EndpointDispatcher

Возвращает или задает диспетчер конечной точки для проверяемой или изменяемой конечной точки.Gets or sets the endpoint dispatcher for the endpoint to inspect or modify.

Extensions Extensions Extensions Extensions

Возвращает коллекцию расширений службы из контекста текущего сообщения.Gets the collection of service extensions from the current message context.

HasSupportingTokens HasSupportingTokens HasSupportingTokens HasSupportingTokens

Получает значение, указывающее, имеет ли входящее сообщение вспомогательные маркеры.Gets a value that indicates whether the incoming message has supporting tokens.

Host Host Host Host

Возвращает значение ServiceHost для объекта текущей службы.Gets the ServiceHost for the current service object.

IncomingMessageHeaders IncomingMessageHeaders IncomingMessageHeaders IncomingMessageHeaders

Получает заголовки входящих сообщений для OperationContext.Gets the incoming message headers for the OperationContext.

IncomingMessageProperties IncomingMessageProperties IncomingMessageProperties IncomingMessageProperties

Получает свойства для входящего сообщения в контексте OperationContext.Gets the message properties for the incoming message in the OperationContext.

IncomingMessageVersion IncomingMessageVersion IncomingMessageVersion IncomingMessageVersion

Получает свойства для SOAP-версии входящего сообщения в контексте OperationContext.Gets the incoming SOAP message version for the OperationContext.

InstanceContext InstanceContext InstanceContext InstanceContext

Получает объект InstanceContext, управляющих текущим экземпляром службы.Gets the InstanceContext object that manages the current service instance.

IsUserContext IsUserContext IsUserContext IsUserContext

Это свойство предназначено для системных целей и не должно вызываться пользователями.This property is intended for system use and should not be called by users.

OutgoingMessageHeaders OutgoingMessageHeaders OutgoingMessageHeaders OutgoingMessageHeaders

Получает заголовки исходящих сообщений для активного контекста OperationContext.Gets the outgoing message headers for the active OperationContext.

OutgoingMessageProperties OutgoingMessageProperties OutgoingMessageProperties OutgoingMessageProperties

Получает свойства для исходящего сообщения в активном контексте OperationContext.Gets the message properties for the outbound message in the active OperationContext.

RequestContext RequestContext RequestContext RequestContext

Возвращает или задает реализацию RequestContext для этого метода.Gets or sets the RequestContext implementation for this method.

ServiceSecurityContext ServiceSecurityContext ServiceSecurityContext ServiceSecurityContext

Возвращает или задает контекст ServiceSecurityContext, в котором выполняется этот метод.Gets or sets the ServiceSecurityContext within which this method executes.

SessionId SessionId SessionId SessionId

Получает строку String, используемую для идентификации текущего сеанса.Gets the String used to identify the current session.

SupportingTokens SupportingTokens SupportingTokens SupportingTokens

Получает коллекцию ICollection<T> типа SecurityToken.Gets a ICollection<T> of type SecurityToken.

Методы

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Определяет, равен ли заданный объект текущему объекту.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetCallbackChannel<T>() GetCallbackChannel<T>() GetCallbackChannel<T>() GetCallbackChannel<T>()

Возвращает канал экземпляру клиента, вызвавшему текущую операцию.Gets a channel to the client instance that called the current operation.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Служит хэш-функцией по умолчанию.Serves as the default hash function.

(Inherited from Object)
GetType() GetType() GetType() GetType()

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

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Inherited from Object)
SetTransactionComplete() SetTransactionComplete() SetTransactionComplete() SetTransactionComplete()

Фиксирует выполняемую транзакцию.Commits the currently executing transaction.

ToString() ToString() ToString() ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Inherited from Object)

События

OperationCompleted OperationCompleted OperationCompleted OperationCompleted

Создается по завершении операции.Occurs when the operation has completed.

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