OperationContext Třída

Definice

Poskytuje přístup ke kontextu spuštění metody služby.

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)
Dědičnost
OperationContext
Implementuje

Příklady

Následující příklad kódu používá Current vlastnost a GetCallbackChannel metodu k získání kanálu zpět volajícímu z metody. Všechny metody v tomto příkladu jsou jednosměrné metody, které umožňují službě a klientovi komunikovat v obou směrech nezávisle. V tomto případě ukázková klientská aplikace očekává před ukončením pouze jedno zpětné volání, ale jiný klient, například klient model Windows Forms, může ze služby přijmout libovolný počet volání.

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

Následující klient implementuje pro SampleDuplexHelloCallback příjem zprávy zpětného volání. Importovaný kontrakt zpětného volání nemá stejný název jako kontrakt ve službě kvůli použití Name vlastnosti v předchozím příkladu. Všimněte si, že klient nepředpokládá, zda nebo kdy může obdržet zpětné volání; zpětné volání serveru je zcela nezávislé na odchozím volání klienta.

Poznámka

Příklad, který používá OperationContext třídu ve scénáři klienta, najdete v tématu 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

Poznámky

OperationContext Pro přístup k aktuálnímu prostředí provádění operací použijte z operace služby . Kontext operace se používá zejména pro přístup ke kanálům zpětného volání v duplexních službách, k ukládání dodatečných dat o stavu napříč částmi operací a pro přístup k hlavičkám a vlastnostem příchozích zpráv, stejně jako k přidávání záhlaví a vlastností odchozích zpráv.

Další informace o používání rozšíření k ukládání dat stavu najdete v tématu Rozšiřitelné objekty.

OperationContext následující vlastnosti a metody.

Konstruktory

OperationContext(IContextChannel)

Inicializuje novou instanci OperationContext třídy, která používá zadaný IContextChannel v klientské aplikaci.

Vlastnosti

Channel

Získá kanál přidružený k aktuálnímu OperationContext objektu.

ClaimsPrincipal

Získá objekt zabezpečení založený na deklarací identity přidružený k operaci.

Current

Získá nebo nastaví kontext spuštění pro aktuální vlákno.

EndpointDispatcher

Získá nebo nastaví dispečer koncového bodu pro koncový bod ke kontrole nebo úpravě.

Extensions

Získá kolekci rozšíření služby z kontextu aktuální zprávy.

HasSupportingTokens

Získá hodnotu, která označuje, zda příchozí zpráva má podpůrné tokeny.

Host

ServiceHost Získá pro aktuální objekt služby.

IncomingMessageHeaders

Získá záhlaví příchozí zprávy pro OperationContext.

IncomingMessageProperties

Získá vlastnosti zprávy příchozí zprávy v .OperationContext

IncomingMessageVersion

Získá verzi příchozí zprávy SOAP pro OperationContext.

InstanceContext

InstanceContext Získá objekt, který spravuje aktuální instanci služby.

IsUserContext

Tato vlastnost je určená pro použití v systému a uživatelé by ji neměli volat.

OutgoingMessageHeaders

Získá záhlaví odchozí zprávy pro aktivní OperationContext.

OutgoingMessageProperties

Získá vlastnosti zprávy odchozí zprávy v aktivní OperationContext.

RequestContext

Získá nebo nastaví implementaci RequestContext pro tuto metodu.

ServiceSecurityContext

Získá nebo nastaví, ServiceSecurityContext ve kterém tato metoda provádí.

SessionId

String Získá slouží k identifikaci aktuální relace.

SupportingTokens

ICollection<T> Získá typ SecurityToken.

Metody

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
GetCallbackChannel<T>()

Získá kanál do instance klienta, která volala aktuální operaci.

GetHashCode()

Slouží jako výchozí hashovací funkce.

(Zděděno od Object)
GetType()

Type Získá z aktuální instance.

(Zděděno od Object)
MemberwiseClone()

Vytvoří mělkou kopii aktuálního Objectsouboru .

(Zděděno od Object)
SetTransactionComplete()

Potvrdí aktuálně spuštěnou transakci.

ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)

Událost

OperationCompleted

Vyvolá se po dokončení operace.

Platí pro