Condividi tramite


Specifica del comportamento in fase di esecuzione dei client

I client Windows Communication Foundation (WCF), come i servizi Windows Communication Foundation (WCF), possono essere configurati per modificare il proprio comportamento in fase di esecuzione e adattarlo alle esigenze dell'applicazione client. Sono disponibili tre attributi per la specifica del comportamento in fase di esecuzione dei client. Gli oggetti callback dei client duplex possono utilizzare gli attributi CallbackBehaviorAttribute e CallbackDebugBehavior per modificare il proprio comportamento in fase di esecuzione. L'altro attributo, ClientViaBehavior, può essere utilizzato per separare la destinazione logica dalla destinazione di rete immediata. Inoltre, i tipi di callback dei client duplex possono utilizzare alcuni dei comportamenti del lato servizi. Per ulteriori informazioni, vedere Specifica del comportamento in fase di esecuzione del servizio.

Utilizzo di CallbackBehaviorAttribute

È possibile configurare o estendere il comportamento di esecuzione dell'implementazione di un contratto di callback in un'applicazione client utilizzando la classe CallbackBehaviorAttribute. Questo attributo esegue, per la classe di callback, una funzione simile a quella della classe ServiceBehaviorAttribute, fatta eccezione per il comportamento di creazione di istanze e le impostazioni di transazione.

La classe CallbackBehaviorAttribute deve essere applicata alla classe che implementa il contratto di callback. Se viene applicata all'implementazione di un contratto non duplex, viene generata un'eccezione InvalidOperationException in fase di esecuzione. Nell'esempio di codice seguente vengono mostrate una classe CallbackBehaviorAttribute su un oggetto callback che utilizza l'oggetto SynchronizationContext per determinare il thread su cui eseguire il marshalling, la proprietà ValidateMustUnderstand per applicare la convalida del messaggio e la proprietà IncludeExceptionDetailInFaults per restituire eccezioni come oggetti FaultException al servizio a scopo di debug.

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

Utilizzo di CallbackDebugBehavior per abilitare il flusso di informazioni sulle eccezioni gestite

È possibile abilitare il flusso di informazioni sulle eccezioni gestite in un oggetto callback client diretto al servizio a scopo di debug impostando la proprietà IncludeExceptionDetailInFaults su true a livello di programmazione o da un file di configurazione dell'applicazione.

La restituzione ai servizi delle informazioni sulle eccezioni gestite può rappresentare un rischio per la protezione, poiché i dettagli delle eccezioni espongono informazioni sull'implementazione del client interno utilizzabili da servizi non autorizzati. Inoltre, sebbene le proprietà CallbackDebugBehavior possono essere impostate anche a livello di programmazione, può essere facile dimenticare di disattivare IncludeExceptionDetailInFaults quando si esegue la distribuzione.

A causa dei problemi di sicurezza coinvolti, è consigliato:

  • Utilizzare un file di configurazione dell'applicazione per impostare il valore della proprietà IncludeExceptionDetailInFaults su true.

  • Si procede in questo modo solo negli scenari di debug controllati.

Nell'esempio di codice seguente viene mostrato un file di configurazione client che indica a WCF di restituire informazioni sulle eccezioni gestite da un oggetto callback client in messaggi SOAP.

Utilizzo del comportamento ClientViaBehavior

È possibile utilizzare il comportamento ClientViaBehavior per specificare l'URI (Uniform Resource Identifier) per il quale deve essere creato il canale del trasporto. Utilizzare questo comportamento quando la destinazione di rete immediata non è il processore desiderato del messaggio. Questo consente conversazioni multihop quando l'applicazione chiamante non conosce necessariamente la destinazione finale o quando l'intestazione Via della destinazione non è un indirizzo.

Vedere anche

Concetti

Specifica del comportamento in fase di esecuzione del servizio