Partager via


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

Les clients Windows Communication Foundation (WCF), tels que les services WINDOWS Communication Foundation (WCF), peuvent être configurés pour modifier le comportement d’exécution en fonction de l’application cliente. Trois attributs sont disponibles pour spécifier le comportement d’exécution du client. Les objets de rappel client duplex peuvent utiliser les attributs CallbackBehaviorAttribute et CallbackDebugBehavior pour modifier leur comportement d’exécution. L’autre attribut, ClientViaBehaviorpeut ê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 Run-Time.

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 à l’aide de la CallbackBehaviorAttribute classe. Cet attribut effectue une fonction similaire pour la classe de rappel que la classe ServiceBehaviorAttribute, à l'exception des comportements d'instanciation et des paramètres de transaction.

La CallbackBehaviorAttribute classe doit être appliquée à la classe qui implémente le contrat de rappel. Lorsqu'elle est appliquée à une implémentation de contrat nonduplex, une exception InvalidOperationException est levée au moment de l'exécution. L’exemple de code suivant montre une CallbackBehaviorAttribute classe sur un objet de rappel qui utilise l’objet SynchronizationContext pour déterminer le thread à transférer, la propriété ValidateMustUnderstand pour appliquer la validation des messages et la propriété IncludeExceptionDetailInFaults pour renvoyer les exceptions sous forme d'objets FaultException au service dans le but de déboguer.

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 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

Utilisation de CallbackDebugBehavior pour activer le flux d’informations sur les exceptions géré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 renvoi d’informations sur les exceptions gérées aux services peut être un risque de sécurité, car les détails de l’exception exposent des informations sur l’implémentation du client interne que les services non autorisés peuvent utiliser. En outre, bien que les CallbackDebugBehavior propriétés puissent également être définies par programme, il peut être facile d’oublier de désactiver IncludeExceptionDetailInFaults lors du déploiement.

En raison des problèmes de sécurité impliqués, il est fortement recommandé de :

  • Vous utilisez un fichier de configuration d’application pour définir la valeur de la propriété IncludeExceptionDetailInFaults à true.

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

L’exemple de code suivant montre un fichier de configuration client qui indique à WCF de retourner des informations d’exception managées à partir d’un objet de rappel client dans les messages SOAP.

  <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>

Utilisation du comportement ClientViaBehavior

Vous pouvez utiliser le ClientViaBehavior comportement pour spécifier l’identificateur de ressource uniforme 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 active les conversations à plusieurs tronçons lorsque l’application appelante ne connaît pas nécessairement la destination ultime ou lorsque l’en-tête de destination Via n’est pas une adresse.

Voir aussi