Spécification du comportement du client au moment de l'exécution

Les clients Windows Communication Foundation (WCF), comme les services Windows Communication Foundation (WCF), peuvent être configurés pour modifier le comportement à l'exécution en fonction de l'application cliente. Trois attributs sont disponibles pour spécifier le comportement du client au moment de l'exécution. Les objets de rappel de client duplex peuvent utiliser les attributs CallbackBehaviorAttribute et CallbackDebugBehavior pour modifier leur comportement à l'exécution. L'autre attribut, ClientViaBehavior, peut être utilisé pour séparer la destination logique de la destination réseau immédiate. De plus, les types de rappel de client duplex peuvent utiliser certains des comportements du côté service. Pour plus d'informations, consultez Spécification du comportement du service au moment de l'exécution.

Utilisation de CallbackBehaviorAttribute

Vous pouvez configurer ou étendre le comportement d'exécution d'une implémentation de contrat de rappel dans une application cliente en utilisant la classe CallbackBehaviorAttribute. Cet attribut exécute pour la classe de rappel une fonction semblable à la classe ServiceBehaviorAttribute, à l'exception du comportement d'instanciation et des paramètres de transaction.

La classe CallbackBehaviorAttribute doit être appliquée à la classe qui implémente le contrat de rappel. En cas d'application à une implémentation de contrat non-duplex, une exception InvalidOperationException est levée au moment de l'exécution. L'exemple de code suivant illustre une classe CallbackBehaviorAttribute sur un objet de rappel qui utilise l'objet SynchronizationContext pour déterminer le thread à marshaler, la propriété ValidateMustUnderstand pour appliquer la validation de message et la propriété IncludeExceptionDetailInFaults pour retourner des exceptions comme objets FaultException au service à des fins de débogage.

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
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();
    }
  }
}

Utilisation de CallbackDebugBehavior pour activer le flux d'informations d'exceptions managées

Vous pouvez activer le flux d'informations d'exceptions managées dans un objet de rappel client au service à des fins de débogage en affectant à la propriété IncludeExceptionDetailInFaults la valeur true par programme ou à partir d'un fichier de configuration d'application.

Le retour d'informations sur les exceptions managées aux services peut constituer un problème de sécurité car les détails d'exception exposent des informations relatives à l'implémentation cliente interne que des services non autorisés pourraient utiliser. De plus, bien que les propriétés CallbackDebugBehavior puissent également être définies par programme, il peut être facile d'oublier de désactiver IncludeExceptionDetailInFaults lors du déploiement.

Étant donné les problèmes de sécurité impliqués, il est vivement recommandé :

  • d'utiliser un fichier de configuration d'application pour affecter à la propriété IncludeExceptionDetailInFaults la valeur true ;

  • de ne procéder ainsi que dans des scénarios de débogage contrôlés.

L'exemple de code suivant illustre un fichier de configuration client qui fait en sorte que WCF retourne des informations sur les exceptions managées à partir d'un objet de rappel client dans des messages SOAP.

Utilisation du comportement ClientViaBehavior

Vous pouvez utiliser le comportement ClientViaBehavior pour spécifier l'URI pour lequel le canal de transport doit être créé. Utilisez ce comportement lorsque la destination réseau immédiate n'est pas le processeur prévu du message. Cela autorise les conversations à sauts multiples lorsque l'application appelante ne connaît pas nécessairement la destination ultime ou lorsque l'en-tête Via de destination n'est pas une adresse.

Voir aussi

Concepts

Spécification du comportement du service au moment de l'exécution