OperationContextScope クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
スコープに OperationContext オブジェクトが含まれるブロックを作成します。
public ref class OperationContextScope sealed : IDisposable
public sealed class OperationContextScope : IDisposable
type OperationContextScope = class
interface IDisposable
Public NotInheritable Class OperationContextScope
Implements IDisposable
- 継承
-
OperationContextScope
- 実装
例
次の例では、送信メッセージにカスタム ヘッダーを追加するために、OperationContextScope を使用してクライアント アプリケーションに新しいコンテキストを作成する方法を示しています。
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Threading;
public class Client : ISampleServiceCallback
{
ManualResetEvent wait = null;
Client()
{
this.wait = new ManualResetEvent(false);
}
public static void Main()
{
Client client = new Client();
client.Run();
}
void Run()
{
// Picks up configuration from the config file.
SampleServiceClient wcfClient = new SampleServiceClient(new InstanceContext(this));
try
{
using (OperationContextScope scope = new OperationContextScope(wcfClient.InnerChannel))
{
MessageHeader header
= MessageHeader.CreateHeader(
"Service-Bound-CustomHeader",
"http://Microsoft.WCF.Documentation",
"Custom Happy Value."
);
OperationContext.Current.OutgoingMessageHeaders.Add(header);
// Making calls.
Console.WriteLine("Enter the greeting to send: ");
string greeting = Console.ReadLine();
//Console.ReadLine();
header = MessageHeader.CreateHeader(
"Service-Bound-OneWayHeader",
"http://Microsoft.WCF.Documentation",
"Different Happy Value."
);
OperationContext.Current.OutgoingMessageHeaders.Add(header);
// One-way
wcfClient.Push(greeting);
this.wait.WaitOne();
// Done with service.
wcfClient.Close();
Console.WriteLine("Done!");
Console.ReadLine();
}
}
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();
}
}
#region ISampleServiceCallback Members
public void PushBack(string msg)
{
Console.WriteLine("Service said: " + msg);
this.WriteHeaders(OperationContext.Current.IncomingMessageHeaders);
this.wait.Set();
}
void WriteHeaders(MessageHeaders headers)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("IncomingHeader:");
Console.ForegroundColor = ConsoleColor.Blue;
foreach (MessageHeaderInfo h in headers)
{
if (!h.Actor.Equals(String.Empty))
Console.WriteLine("\t" + h.Actor);
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("\t" + h.Name);
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("\t" + h.Namespace);
Console.WriteLine("\t" + h.Relay);
if (h.IsReferenceParameter)
{
Console.WriteLine("IsReferenceParameter header detected: " + h.ToString());
}
}
Console.ResetColor();
}
#endregion
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.Threading
Public Class Client
Implements ISampleServiceCallback
Private wait As ManualResetEvent = Nothing
Private Sub New()
Me.wait = New ManualResetEvent(False)
End Sub
Public Shared Sub Main()
Dim client As New Client()
client.Run()
End Sub
Private Sub Run()
' Picks up configuration from the config file.
Dim wcfClient As New SampleServiceClient(New InstanceContext(Me))
Try
Using scope As New OperationContextScope(wcfClient.InnerChannel)
Dim header As MessageHeader = MessageHeader.CreateHeader("Service-Bound-CustomHeader", _
"http://Microsoft.WCF.Documentation", "Custom Happy Value.")
OperationContext.Current.OutgoingMessageHeaders.Add(header)
' Making calls.
Console.WriteLine("Enter the greeting to send: ")
Dim greeting As String = Console.ReadLine()
'Console.ReadLine();
header = MessageHeader.CreateHeader("Service-Bound-OneWayHeader", _
"http://Microsoft.WCF.Documentation", "Different Happy Value.")
OperationContext.Current.OutgoingMessageHeaders.Add(header)
' One-way
wcfClient.Push(greeting)
Me.wait.WaitOne()
' Done with service.
wcfClient.Close()
Console.WriteLine("Done!")
Console.ReadLine()
End Using
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
#Region "ISampleServiceCallback Members"
Public Sub PushBack(ByVal msg As String) Implements ISampleServiceCallback.PushBack
Console.WriteLine("Service said: " & msg)
Me.WriteHeaders(OperationContext.Current.IncomingMessageHeaders)
Me.wait.Set()
End Sub
Private Sub WriteHeaders(ByVal headers As MessageHeaders)
Console.ForegroundColor = ConsoleColor.Red
Console.WriteLine("IncomingHeader:")
Console.ForegroundColor = ConsoleColor.Blue
For Each h As MessageHeaderInfo In headers
If Not h.Actor.Equals(String.Empty) Then
Console.WriteLine(vbTab & h.Actor)
End If
Console.ForegroundColor = ConsoleColor.White
Console.WriteLine(vbTab & h.Name)
Console.ForegroundColor = ConsoleColor.Blue
Console.WriteLine(vbTab & h.Namespace)
Console.WriteLine(vbTab & h.Relay)
If h.IsReferenceParameter = True Then
Console.WriteLine("IsReferenceParameter header detected: " & h.ToString())
End If
Next h
Console.ResetColor()
End Sub
#End Region
End Class
注釈
OperationContextScope クラスを使用して、指定した OperationContext オブジェクトを使用する特定の OperationContext オブジェクトまたは新しいIContextChannel オブジェクトのスコープを作成します。 は OperationContextScope 、Windows Communication Foundation (WCF) サービスまたは WCF クライアント アプリケーションで使用できます。
OperationContextScope オブジェクトが現在の操作コンテキストを確立した後は、OperationContext を使用して、次の操作を実行できます。
受信メッセージと送信メッセージのヘッダーと他のプロパティにアクセスして変更します。
ディスパッチャー、ホスト、チャネル、および拡張を含むランタイムにアクセスします。
セキュリティ、インスタンス、および要求コンテキストなどの他の種類のコンテキストにアクセスします。
OperationContext オブジェクトに関連付けられたチャネルにアクセスします。チャネルが System.ServiceModel.Channels.ISession を実装する場合は、関連付けられたチャネルのセッション ID にアクセスします。
OperationContextScope が作成されると、現在の OperationContext は保存され、新しい OperationContext が Current プロパティによって返される値になります。 OperationContextScope が破棄されると、元の OperationContext が復元されます。
警告
OperationContextScope ブロック内で非同期の "await" パターンを使用しないでください。 継続が発生すると、別のスレッドで実行される可能性があり、OperationContextScope はスレッド固有です。 非同期呼び出しで "await" を呼び出す必要がある場合は、OperationContextScope ブロックの外部でそれを使用します。
コンストラクター
OperationContextScope(IContextChannel) |
指定した OperationContextScope を使用して新しい IContextChannel のスコープを作成するOperationContext クラスの新しいインスタンスを初期化します。 |
OperationContextScope(OperationContext) |
指定した OperationContextScope オブジェクトのスコープを作成する OperationContext クラスの新しいインスタンスを初期化します。 |
メソッド
Dispose() |
元の OperationContext をアクティブなコンテキストに復元し、OperationContextScope オブジェクトをリサイクルします。 |
Equals(Object) |
指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。 (継承元 Object) |
GetHashCode() |
既定のハッシュ関数として機能します。 (継承元 Object) |
GetType() |
現在のインスタンスの Type を取得します。 (継承元 Object) |
MemberwiseClone() |
現在の Object の簡易コピーを作成します。 (継承元 Object) |
ToString() |
現在のオブジェクトを表す文字列を返します。 (継承元 Object) |
適用対象
.NET