Angeben des ClientlaufzeitverhaltensSpecifying Client Run-Time Behavior

Windows Communication Foundation (WCF)-Clients wie Windows Communication Foundation (WCF)-Dienste können konfiguriert werden, um das Laufzeitverhalten die Clientanwendung entsprechend ändern.Windows Communication Foundation (WCF) clients, like Windows Communication Foundation (WCF) services, can be configured to modify the run-time behavior to suit the client application. Drei Attribute sind zum Angeben des Clientlaufzeitverhaltens verfügbar.Three attributes are available for specifying client run-time behavior. Duplexclient-Rückrufobjekte können das CallbackBehaviorAttribute-Attribut und das CallbackDebugBehavior-Attribut verwenden, um ihr Laufzeitverhalten zu ändern.Duplex client callback objects can use the CallbackBehaviorAttribute and CallbackDebugBehavior attributes to modify their run-time behavior. Das andere Attribut, ClientViaBehavior, kann verwendet werden, um das logische Ziel vom unmittelbaren Netzwerkziel zu trennen.The other attribute, ClientViaBehavior, can be used to separate the logical destination from the immediate network destination. Außerdem können Duplexclient-Rückruftypen Teile des Dienstseitenverhaltens verwenden.In addition, duplex client callback types can use some of the service-side behaviors. Weitere Informationen finden Sie unter Run-Time-Dienstverhalten angeben.For more information, see Specifying Service Run-Time Behavior.

Verwenden des CallbackBehaviorAttributeUsing the CallbackBehaviorAttribute

Sie können das Ausführungsverhalten einer Rückrufvertragsimplementierung in einer Clientanwendung mit der CallbackBehaviorAttribute-Klasse konfigurieren oder erweitern.You can configure or extend the execution behavior of a callback contract implementation in a client application by using the CallbackBehaviorAttribute class. Dieses Attribut führt eine ähnliche Funktion für die Rückrufklasse wie die ServiceBehaviorAttribute-Klasse aus, das Instanziieren von Verhaltens- und Transaktionseinstellungen ausgenommen.This attribute performs a similar function for the callback class as the ServiceBehaviorAttribute class, with the exception of instancing behavior and transaction settings.

Die CallbackBehaviorAttribute-Klasse muss auf die Klasse angewendet werden, die den Rückrufvertrag implementiert.The CallbackBehaviorAttribute class must be applied to the class that implements the callback contract. Beim Anwenden auf eine Nicht-Duplex-Vertragsimplementierung wird zur Laufzeit eine InvalidOperationException-Ausnahme ausgelöst.If applied to a nonduplex contract implementation, an InvalidOperationException exception is thrown at run time. Das folgende Codebeispiel zeigt eine CallbackBehaviorAttribute-Klasse für ein Rückrufobjekt, das das SynchronizationContext-Objekt zur Bestimmung des Threads für das Marshallen verwendet, die ValidateMustUnderstand-Eigenschaft zum Erzwingen der Nachrichtenvalidierung und die IncludeExceptionDetailInFaults-Eigenschaft zum Zurückgeben von Ausnahmen als FaultException-Objekte an den Dienst zum Debuggen.The following code example shows a CallbackBehaviorAttribute class on a callback object that uses the SynchronizationContext object to determine the thread to marshal to, the ValidateMustUnderstand property to enforce message validation, and the IncludeExceptionDetailInFaults property to return exceptions as FaultException objects to the service for debugging purposes.

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  [CallbackBehaviorAttribute(
   IncludeExceptionDetailInFaults= true, 
    UseSynchronizationContext=true,
    ValidateMustUnderstand=true
  )]
  public class Client : SampleDuplexHelloCallback
  {
    AutoResetEvent waitHandle;

    public Client()
    {
      waitHandle = new AutoResetEvent(false);
    }

    public void Run()
    {
      // Picks up configuration from the configuration file.
      SampleDuplexHelloClient wcfClient
        = new SampleDuplexHelloClient(new InstanceContext(this), "WSDualHttpBinding_SampleDuplexHello");
      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();
      }
      catch (TimeoutException timeProblem)
      {
        Console.WriteLine("The service operation timed out. " + timeProblem.Message);
        Console.ReadLine();
      }
      catch (CommunicationException commProblem)
      {
        Console.WriteLine("There was a communication problem. " + commProblem.Message);
        Console.ReadLine();
      }
    }
    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 Microsoft.VisualBasic
Imports System
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.Threading

Namespace Microsoft.WCF.Documentation
  <CallbackBehaviorAttribute(IncludeExceptionDetailInFaults:= True, UseSynchronizationContext:=True, ValidateMustUnderstand:=True)> _
  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 configuration file.
	  Dim wcfClient As New SampleDuplexHelloClient(New InstanceContext(Me), "WSDualHttpBinding_SampleDuplexHello")
	  Try
		Console.ForegroundColor = ConsoleColor.White
		Console.WriteLine("Enter a greeting to send and press ENTER: ")
		Console.Write(">>> ")
		Console.ForegroundColor = ConsoleColor.Green
		Dim greeting As String = 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()
	  Catch timeProblem As TimeoutException
		Console.WriteLine("The service operation timed out. " & timeProblem.Message)
		Console.ReadLine()
	  Catch commProblem As CommunicationException
		Console.WriteLine("There was a communication problem. " & commProblem.Message)
		Console.ReadLine()
	  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

Verwenden von CallbackDebugBehavior zum Aktivieren des Flusses verwalteter AusnahmeinformationenUsing CallbackDebugBehavior to Enable the Flow of Managed Exception Information

Sie können den Fluss verwalteter Ausnahmeinformationen in einem Client-Rückrufobjekt zurück zum Dienst zum Debuggen aktivieren, indem Sie die IncludeExceptionDetailInFaults-Eigenschaft entweder programmgesteuert oder aus einer Anwendungskonfigurationsdatei auf true festlegen.You can enable the flow of managed exception information in a client callback object back to the service for debugging purposes by setting the IncludeExceptionDetailInFaults property to true either programmatically or from an application configuration file.

Verwaltete Ausnahmeinformationen an Dienste zurückzugeben, kann ein Sicherheitsrisiko darstellen, da Ausnahmedetails Informationen zur internen Clientimplementierung offen legen, die von nicht autorisierten Diensten verwendet werden können.Returning managed exception information to services can be a security risk because exception details expose information about the internal client implementation that unauthorized services could use. Außerdem wird, obwohl die CallbackDebugBehavior-Eigenschaften auch programmgesteuert festgelegt werden können, bei der Bereitstellung das Deaktivieren von IncludeExceptionDetailInFaults schnell vergessen.In addition, although the CallbackDebugBehavior properties can also be set programmatically, it can be easy to forget to disable IncludeExceptionDetailInFaults when deploying.

Wegen der damit verbundenen Sicherheitsprobleme wird Folgendes dringend empfohlen:Because of the security issues involved, it is strongly recommended that:

  • Verwenden Sie eine Anwendungskonfigurationsdatei, um den Wert der IncludeExceptionDetailInFaults-Eigenschaft auf true festzulegen.You use an application configuration file to set the value of the IncludeExceptionDetailInFaults property to true.

  • Führen Sie diesen Vorgang nur in gesteuerten Debugszenarien aus.You do so only in controlled debugging scenarios.

Das folgende Codebeispiel zeigt einen Client-Konfigurationsdatei, der anweist, WCF, verwaltete Ausnahmeinformationen aus einem Client-Rückrufobjekt in SOAP-Nachrichten zurückzugeben.The following code example shows a client configuration file that instructs WCF to return managed exception information from a client callback object in SOAP messages.

  <client>
      <endpoint 
        address="http://localhost:8080/DuplexHello" 
        binding="wsDualHttpBinding"
        bindingConfiguration="WSDualHttpBinding_SampleDuplexHello"
        contract="SampleDuplexHello" 
        name="WSDualHttpBinding_SampleDuplexHello"
        behaviorConfiguration="enableCallbackDebug">
      </endpoint>
  </client>
<behaviors>
  <endpointBehaviors>
    <behavior name="enableCallbackDebug">
      <callbackDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </endpointBehaviors>
</behaviors>

Verwenden des ClientViaBehavior-VerhaltensUsing the ClientViaBehavior Behavior

Sie können mit dem ClientViaBehavior-Verhalten den URI (Uniform Resource Identifier) angeben, für den der Transportkanal erstellt werden soll.You can use the ClientViaBehavior behavior to specify the Uniform Resource Identifier for which the transport channel should be created. Verwenden Sie dieses Verhalten, wenn das unmittelbare Netzwerkziel nicht der gewünschte Prozessor der Nachricht ist.Use this behavior when the immediate network destination is not the intended processor of the message. Dies ermöglicht Konversationen über mehrere Hops, wenn die aufrufende Anwendung das endgültige Ziel nicht unbedingt kennt oder wenn der Via-Header des Ziels keine Adresse ist.This enables multiple-hop conversations when the calling application does not necessarily know the ultimate destination or when the destination Via header is not an address.

Siehe auchSee Also

Angeben des DienstlaufzeitverhaltensSpecifying Service Run-Time Behavior