Compartir a través de


Especificación del comportamiento de tiempo de ejecución del cliente

Los clientes Windows Communication Foundation (WCF), como los servicios Windows Communication Foundation (WCF), se pueden configurar para modificar el comportamiento de tiempo de ejecución con el fin de satisfacer la aplicación cliente. Tres atributos están disponibles para especificar el comportamiento de 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 utilizar 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, vea Especificación del comportamiento en tiempo de ejecución del servicio.

Utilizar CallbackBehaviorAttribute

Puede configurar o extender el comportamiento de ejecución de una implementación de contrato de devolución de llamada en una aplicación cliente utilizando 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 clase CallbackBehaviorAttribute se debe aplicar a la clase que implementa el contrato de devolución de llamada. 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 calcular 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.

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

Utilizar CallbackDebugBehavior para habilitar el flujo de información de excepción administrada

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 la información de excepción administrada a los servicios puede suponer un riesgo para la seguridad porque los datos de la excepción exponen información sobre la implementación del cliente interna que los servicios desautorizados podrían utilizar. Además, aunque también se pueden establecer las propiedades CallbackDebugBehavior mediante programación, puede ser fácil olvidarse de deshabilitar IncludeExceptionDetailInFaults en la implementación.

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

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

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

El ejemplo de código siguiente muestra un archivo de configuración del cliente que indica a WCF que devuelva la información de excepción administrada de un objeto de devolución de llamada de cliente en mensajes SOAP.

Utilizar el comportamiento de ClientViaBehavior

Puede utilizar el comportamiento ClientViaBehavior para especificar el Identificador uniforme de recursos para el cual se debería crear el canal de transporte. Utilice este comportamiento cuando el destino de la red inmediato no es el procesador de impresión previsto del mensaje. Esto habilita conversaciones de varios saltos cuando la aplicación que realiza la llamada no conoce necesariamente el destino último o cuando el encabezado de destino Via no es una dirección.

Vea también

Conceptos

Especificación del comportamiento en tiempo de ejecución del servicio