OperationContextScope OperationContextScope OperationContextScope OperationContextScope Class

定義

建立一個區塊,OperationContext 物件在其範圍之內。Creates a block within which an OperationContext object is in scope.

public ref class OperationContextScope sealed : IDisposable
public sealed class OperationContextScope : IDisposable
type OperationContextScope = class
    interface IDisposable
Public NotInheritable Class OperationContextScope
Implements IDisposable
繼承
OperationContextScopeOperationContextScopeOperationContextScopeOperationContextScope
實作

範例

下列範例將示範如何使用 OperationContextScope 於用戶端應用程式內建立新的內容,以便將自訂標頭新增至傳出訊息。The following example shows how to use the OperationContextScope to create a new context in a client application to add a custom header to the outgoing message.

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 == true)
      {
        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 物件的範圍,或使用指定的 OperationContextIContextChannel物件建立新 物件的範圍。Use the OperationContextScope class to create a scope for a specific OperationContext object or a scope for a new OperationContext object using a specified IContextChannel object. OperationContextScope可以用於 Windows Communication Foundation (WCF) 服務或 WCF 用戶端應用程式。An OperationContextScope can be used in a Windows Communication Foundation (WCF) service or WCF client application.

一旦 OperationContextScope 物件建立了目前的作業內容,您便可使用 OperationContext 來進行下列動作︰Once the OperationContextScope object has established the current operation context, you can use the OperationContext to:

  • 存取並修改傳入與傳出訊息的標頭與其他屬性。Access and modify incoming and outgoing message headers and other properties.

  • 存取執行階段,包括發送器、主機、通道與擴充部分。Access the runtime, including dispatchers, the host, channel, and extensions.

  • 存取其他型別的內容,例如安全性、執行個體與要求內容。Access other types of contexts, such as security, instance, and request contexts.

  • 存取與 OperationContext 物件相關的通道,或相關通道的工作階段識別項 (若該通道實作了 System.ServiceModel.Channels.ISession)。Access the channel associated with the OperationContext object or (if the channel implements System.ServiceModel.Channels.ISession) the associated channel's session identifier.

建立 OperationContextScope 時,會儲存目前的 OperationContext,且新的 OperationContext 會成為 Current 屬性所傳回的物件。When an OperationContextScope is created, the current OperationContext is stored and the new OperationContext becomes the one returned by the Current property. 處置 OperationContextScope 時,原本的 OperationContext 便會還原。When the OperationContextScope is disposed, the original OperationContext is restored.

警告

請勿使用 OperationContextScope 區塊內的非同步 「 等候 」 模式。Do not use the asynchronous "await" pattern within a OperationContextScope block. 接續時,它可能在不同的執行緒上執行,並且 OperationContextScope 為特定的執行緒。When the continuation occurs, it may run on a different thread and OperationContextScope is thread specific. 如果您需要呼叫 await > 非同步呼叫,則會使用 OperationContextScope 區塊之外。If you need to call "await" for an async call, use it outside of the OperationContextScope block.

建構函式

OperationContextScope(IContextChannel) OperationContextScope(IContextChannel) OperationContextScope(IContextChannel) OperationContextScope(IContextChannel)

初始化 OperationContextScope 類別的新執行個體,此執行個體使用指定的 IContextChannel 建立該範圍的新 OperationContextInitializes a new instance of the OperationContextScope class that uses the specified IContextChannel to create a new OperationContext for the scope.

OperationContextScope(OperationContext) OperationContextScope(OperationContext) OperationContextScope(OperationContext) OperationContextScope(OperationContext)

初始化 OperationContextScope 類別的新執行個體,以建立指定 OperationContext 物件的範圍。Initializes a new instance of the OperationContextScope class to create a scope for the specified OperationContext object.

方法

Dispose() Dispose() Dispose() Dispose()

將原本的 OperationContext 還原至使用中的內容,並回收 OperationContextScope 物件。Restores the original OperationContext to the active context and recycles the OperationContextScope object.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

判斷指定的物件是否等於目前的物件。Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

做為預設雜湊函式。Serves as the default hash function.

(Inherited from Object)
GetType() GetType() GetType() GetType()

取得目前執行個體的 TypeGets the Type of the current instance.

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

建立目前 Object 的淺層複本 (Shallow Copy)。Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

傳回代表目前物件的字串。Returns a string that represents the current object.

(Inherited from Object)

適用於