Compartir a través de


Especificación del comportamiento del cliente Run-Time

Los clientes de Windows Communication Foundation (WCF), como los servicios de Windows Communication Foundation (WCF), se pueden configurar para modificar el comportamiento en tiempo de ejecución para adaptarse a la aplicación cliente. Hay tres atributos disponibles para especificar el comportamiento en tiempo de ejecución del cliente. Los objetos de devolución de llamada de cliente dúplex pueden utilizar CallbackBehaviorAttribute y los atributos CallbackDebugBehavior para modificar su comportamiento de tiempo de ejecución. El otro atributo, ClientViaBehavior, se puede usar para separar el destino lógico del destino de red inmediato. Además, los tipos de devolución de llamada de cliente dúplex pueden utilizar algunos de los comportamientos de lado del servicio. Para obtener más información, consulte Especificación del comportamiento del servicio Run-Time.

Utilizar CallbackBehaviorAttribute

Puede configurar o ampliar el comportamiento de ejecución de una implementación de contrato de devolución de llamada en una aplicación cliente mediante la clase CallbackBehaviorAttribute. Este atributo realiza una función similar para la clase de devolución de llamada como la clase ServiceBehaviorAttribute, con la excepción de crear instancias del comportamiento y configuración de la transacción.

La CallbackBehaviorAttribute clase debe aplicarse a la clase que implementa el contrato de callback. Si se aplica a una implementación de contrato de no dúplex, se produce una excepción InvalidOperationException en tiempo de ejecución. El ejemplo de código siguiente muestra una clase CallbackBehaviorAttribute en un objeto de devolución de llamada que usa el objeto SynchronizationContext para determinar el subproceso para serializar las referencias, la propiedad ValidateMustUnderstand para exigir la validación del mensaje y la propiedad IncludeExceptionDetailInFaults para devolver las excepciones como objetos FaultException al servicio para los propósitos de depuración.

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

Uso de CallbackDebugBehavior para habilitar el flujo de información sobre excepciones administradas

Puede habilitar el flujo de información de excepción administrada en un objeto de devolución de llamada de cliente de nuevo al servicio para fines de depuración estableciendo la propiedad IncludeExceptionDetailInFaults en true mediante programación o desde un archivo de configuración de la aplicación.

Devolver información de excepciones administradas a los servicios puede ser un riesgo de seguridad porque los detalles de la excepción exponen información sobre la implementación de cliente interna que los servicios no autorizados podrían usar. Además, aunque las CallbackDebugBehavior propiedades también se pueden establecer mediante programación, puede ser fácil olvidarse de deshabilitar al implementar IncludeExceptionDetailInFaults .

Debido a los problemas de seguridad implicados, se recomienda encarecidamente que:

  • Use un archivo de configuración de aplicación para establecer el valor de la IncludeExceptionDetailInFaults propiedad en true.

  • lo haga solamente en escenarios de depuración controlados.

En el ejemplo de código siguiente se muestra un archivo de configuración de cliente que indica a WCF que devuelva información sobre excepciones gestionadas desde un objeto de devolución de llamada del cliente en los mensajes 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>

Uso del comportamiento de ClientViaBehavior

Puede usar el ClientViaBehavior comportamiento para especificar el identificador uniforme de recursos para el que se debe crear el canal de transporte. Use este comportamiento cuando el destino de red inmediato no sea el procesador previsto del mensaje. Esto permite conversaciones de varios saltos cuando la aplicación que realiza la llamada no conoce necesariamente el destino final o cuando el encabezado de destino Via no es una dirección.

Consulte también