OperationContext Klass

Definition

Ger åtkomst till körningskontexten för en tjänstmetod.

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)
Arv
OperationContext
Implementeringar

Exempel

I följande kodexempel används Current egenskapen och GetCallbackChannel metoden för att hämta kanalen tillbaka till anroparen inifrån en metod. Alla metoder i det här exemplet är enkelriktade metoder som gör det möjligt för tjänsten och klienten att kommunicera i båda riktningarna oberoende av varandra. I det här fallet förväntar sig exempelklientprogrammet bara ett returanrop innan det avslutas, men en annan klient, till exempel en Windows Forms-klient, kan ta emot valfritt antal anrop från tjänsten.

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

Följande klient implementerar SampleDuplexHelloCallback för att ta emot motringningsmeddelandet. Det importerade återanropskontraktet är inte samma namn som det i tjänsten, på grund av användningen av Name egenskapen i föregående exempel. Observera att klienten inte gör några antaganden om huruvida eller när den kan få ett återanrop. serveråteranropet är helt oberoende av klientens utgående anrop.

Note

Ett exempel som använder OperationContext klassen i ett klientscenario finns OperationContextScopei .

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

Kommentarer

OperationContext Använd inifrån en tjänståtgärd för att få åtkomst till den aktuella åtgärdskörningsmiljön. I synnerhet används åtgärdskontexten för att komma åt motringningskanaler i duplex-tjänster, för att lagra extra tillståndsdata över delar av åtgärderna och för att komma åt inkommande meddelandehuvuden och egenskaper samt lägga till utgående meddelandehuvuden och egenskaper.

Mer information om hur du använder tillägg för att lagra tillståndsdata finns i Utökningsbara objekt.

Har OperationContext följande egenskaper och metoder.

Konstruktorer

Name Description
OperationContext(IContextChannel)

Initierar en ny instans av OperationContext klassen som använder den angivna IContextChannel i ett klientprogram.

Egenskaper

Name Description
Channel

Hämtar kanalen som är associerad med det aktuella OperationContext objektet.

ClaimsPrincipal

Hämtar det anspråksbaserade huvudkontot som är associerat med åtgärden.

Current

Hämtar eller anger körningskontexten för den aktuella tråden.

EndpointDispatcher

Hämtar eller anger slutpunktsutskicket för slutpunkten som ska inspekteras eller ändras.

Extensions

Hämtar samlingen av tjänsttillägg från den aktuella meddelandekontexten.

HasSupportingTokens

Hämtar ett värde som anger om det inkommande meddelandet har stödtoken.

Host

ServiceHost Hämtar för det aktuella tjänstobjektet.

IncomingMessageHeaders

Hämtar inkommande meddelandehuvuden OperationContextför .

IncomingMessageProperties

Hämtar meddelandeegenskaperna för det inkommande meddelandet i OperationContext.

IncomingMessageVersion

Hämtar den inkommande SOAP-meddelandeversionen för OperationContext.

InstanceContext

Hämtar objektet InstanceContext som hanterar den aktuella tjänstinstansen.

IsUserContext

Den här egenskapen är avsedd för systemanvändning och bör inte anropas av användare.

OutgoingMessageHeaders

Hämtar utgående meddelandehuvuden för den aktiva OperationContext.

OutgoingMessageProperties

Hämtar meddelandeegenskaperna för det utgående meddelandet i den aktiva OperationContext.

RequestContext

Hämtar eller anger implementeringen för den RequestContext här metoden.

ServiceSecurityContext

Hämtar eller anger inom vilken den ServiceSecurityContext här metoden körs.

SessionId

Hämtar den String som används för att identifiera den aktuella sessionen.

SupportingTokens

Hämtar en ICollection<T> av typen SecurityToken.

Metoder

Name Description
Equals(Object)

Avgör om det angivna objektet är lika med det aktuella objektet.

(Ärvd från Object)
GetCallbackChannel<T>()

Hämtar en kanal till klientinstansen som anropade den aktuella åtgärden.

GetHashCode()

Fungerar som standard-hash-funktion.

(Ärvd från Object)
GetType()

Hämtar den aktuella instansen Type .

(Ärvd från Object)
MemberwiseClone()

Skapar en ytlig kopia av den aktuella Object.

(Ärvd från Object)
SetTransactionComplete()

Genomför den transaktion som körs just nu.

ToString()

Returnerar en sträng som representerar det aktuella objektet.

(Ärvd från Object)

Händelser

Name Description
OperationCompleted

Inträffar när åtgärden har slutförts.

Gäller för