OperationContext Klasa

Definicja

Zapewnia dostęp do kontekstu wykonywania metody usługi.

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)
Dziedziczenie
OperationContext
Implementuje

Przykłady

Poniższy przykład kodu używa Current właściwości i GetCallbackChannel metody w celu uzyskania kanału z powrotem do obiektu wywołującego z poziomu metody. Wszystkie metody w tym przykładzie to metody jednokierunkowe, umożliwiając usłudze i klientowi niezależne komunikowanie się w obu kierunkach. W takim przypadku przykładowa aplikacja kliencka oczekuje tylko jednego wywołania zwrotnego przed jego zamknięciem, ale inny klient, na przykład klient Windows Forms, może odbierać dowolną liczbę wywołań z usługi.

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

Następujący klient implementuje element SampleDuplexHelloCallback w celu odebrania komunikatu wywołania zwrotnego. Importowany kontrakt wywołania zwrotnego nie jest taką samą nazwą jak ten w usłudze, ze względu na użycie Name właściwości w poprzednim przykładzie. Należy pamiętać, że klient nie przyjmuje żadnych założeń dotyczących tego, czy lub kiedy może otrzymać wywołanie zwrotne; wywołanie zwrotne serwera jest całkowicie niezależne od wywołania wychodzącego klienta.

Uwaga

Przykład użycia klasy w scenariuszu OperationContext klienta można znaleźć w temacie 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

Uwagi

OperationContext Użyj polecenia z poziomu operacji usługi, aby uzyskać dostęp do bieżącego środowiska wykonywania operacji. W szczególności kontekst operacji służy do uzyskiwania dostępu do kanałów wywołania zwrotnego w usługach dwukierunkowych, przechowywania dodatkowych danych stanu w częściach operacji oraz uzyskiwania dostępu do przychodzących nagłówków i właściwości komunikatów, a także dodawania nagłówków i właściwości wychodzących komunikatów.

Aby uzyskać więcej informacji na temat używania rozszerzeń do przechowywania danych stanu, zobacz Extensible Objects (Rozszerzalne obiekty).

Element OperationContext ma następujące właściwości i metody.

Konstruktory

OperationContext(IContextChannel)

Inicjuje OperationContext nowe wystąpienie klasy, która używa klasy określonej IContextChannel w aplikacji klienckiej.

Właściwości

Channel

Pobiera kanał skojarzony z bieżącym OperationContext obiektem.

ClaimsPrincipal

Pobiera podmiot zabezpieczeń oparty na oświadczeniach skojarzony z operacją.

Current

Pobiera lub ustawia kontekst wykonywania dla bieżącego wątku.

EndpointDispatcher

Pobiera lub ustawia dyspozytor punktu końcowego dla punktu końcowego w celu sprawdzenia lub zmodyfikowania.

Extensions

Pobiera kolekcję rozszerzeń usługi z bieżącego kontekstu komunikatu.

HasSupportingTokens

Pobiera wartość wskazującą, czy komunikat przychodzący ma tokeny pomocnicze.

Host

Pobiera element ServiceHost dla bieżącego obiektu usługi.

IncomingMessageHeaders

Pobiera nagłówki komunikatów przychodzących dla .OperationContext

IncomingMessageProperties

Pobiera właściwości komunikatu dla komunikatu przychodzącego w obiekcie OperationContext.

IncomingMessageVersion

Pobiera przychodzącą wersję komunikatu PROTOKOŁU SOAP dla programu OperationContext.

InstanceContext

InstanceContext Pobiera obiekt, który zarządza bieżącym wystąpieniem usługi.

IsUserContext

Ta właściwość jest przeznaczona do użycia systemu i nie powinna być wywoływana przez użytkowników.

OutgoingMessageHeaders

Pobiera nagłówki komunikatów wychodzących dla aktywnego OperationContextpliku .

OutgoingMessageProperties

Pobiera właściwości komunikatu dla komunikatu wychodzącego w aktywnym OperationContextobiekcie .

RequestContext

Pobiera lub ustawia implementację RequestContext dla tej metody.

ServiceSecurityContext

Pobiera lub ustawia ServiceSecurityContext element, w którym jest wykonywana ta metoda.

SessionId

Pobiera element String używany do identyfikowania bieżącej sesji.

SupportingTokens

Pobiera typ ICollection<T>SecurityToken.

Metody

Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

(Odziedziczone po Object)
GetCallbackChannel<T>()

Pobiera kanał do wystąpienia klienta, który nazwał bieżącą operację.

GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetType()

Type Pobiera bieżące wystąpienie.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
SetTransactionComplete()

Zatwierdza aktualnie wykonującą transakcję.

ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Zdarzenia

OperationCompleted

Występuje po zakończeniu operacji.

Dotyczy