次の方法で共有


OperationContext クラス

定義

サービス メソッドの実行コンテキストへのアクセスを提供します。

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)
継承
OperationContext
実装

次のコード例では、 プロパティと GetCallbackChannel メソッドをCurrent使用して、 メソッド内から呼び出し元にチャネルを取得します。 この例のすべてのメソッドは一方向メソッドであり、サービスおよびクライアントが独立して双方向通信できます。 この場合、クライアント アプリケーションの例では、終了する前に 1 つの戻り呼び出しのみを想定していますが、別のクライアント (Windows フォーム クライアントなど) は、サービスから任意の数の呼び出しを受信できます。

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 実装してコールバック メッセージを受信します。 インポートされたコールバック コントラクトは、前の例の プロパティを使用しているため、サービス内の Name コールバック コントラクトと同じ名前ではありません。 クライアントがコールバックを受信するかどうか、または受信タイミングに関する前提はないので、サーバー コールバックがクライアントの送信呼び出しからは完全に独立していることに注意してください。

注意

クライアント シナリオで クラスを OperationContext 使用する例については、「」を参照してください 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 使用して、現在の操作実行環境にアクセスします。 特に、操作コンテキストは、双方向サービスでのコールバック チャネルへのアクセス、操作の複数部分に関係する特別な状態データの保存、受信メッセージ ヘッダーとプロパティへのアクセス、および送信メッセージ ヘッダーとプロパティの追加を行うために使用されます。

拡張機能を使用して状態データを格納する方法の詳細については、「 拡張可能オブジェクト」を参照してください。

には OperationContext 、次のプロパティとメソッドがあります。

コンストラクター

OperationContext(IContextChannel)

クライアント アプリケーション内の指定された OperationContext を使用する IContextChannel クラスの新しいインスタンスを初期化します。

プロパティ

Channel

現在の OperationContext オブジェクトに関連付けられているチャネルを取得します。

ClaimsPrincipal

操作に関連付けられているクレーム ベースのプリンシパルを取得します。

Current

現在のスレッドの実行コンテキストを取得または設定します。

EndpointDispatcher

検査または変更するエンドポイントのエンドポイント ディスパッチャーを取得または設定します。

Extensions

現在のメッセージ コンテキストからサービス拡張のコレクションを取得します。

HasSupportingTokens

受信メッセージがトークンをサポートしているかどうかを示す値を取得します。

Host

現在のサービス オブジェクトの ServiceHost を取得します。

IncomingMessageHeaders

OperationContext の受信メッセージ ヘッダーを取得します。

IncomingMessageProperties

OperationContext 内の受信メッセージのメッセージ プロパティを取得します。

IncomingMessageVersion

OperationContext の受信 SOAP メッセージのバージョンを取得します。

InstanceContext

現在のサービス インスタンスを管理する InstanceContext オブジェクトを取得します。

IsUserContext

このプロパティはシステムによる使用を目的としています。ユーザーが呼び出すためのものではありません。

OutgoingMessageHeaders

アクティブな OperationContext の送信メッセージ ヘッダーを取得します。

OutgoingMessageProperties

アクティブな OperationContext 内の送信メッセージのメッセージ プロパティを取得します。

RequestContext

このメソッドの RequestContext 実装を取得または設定します。

ServiceSecurityContext

このメソッドが実行される ServiceSecurityContext を取得または設定します。

SessionId

現在のセッションを識別するために使用される String を取得します。

SupportingTokens

ICollection<T> 型の SecurityToken を取得します。

メソッド

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
GetCallbackChannel<T>()

現在の操作を呼び出したクライアント インスタンスへのチャネルを取得します。

GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
SetTransactionComplete()

現在実行中のトランザクションをコミットします。

ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

イベント

OperationCompleted

操作の完了時に発生します。

適用対象