Share via


Nastavení běhového chování klienta

Klienti Windows Communication Foundation (WCF), jako jsou služby WCF (Windows Communication Foundation), je možné nakonfigurovat tak, aby upravili chování za běhu tak, aby vyhovovalo klientské aplikaci. Pro určení chování klienta za běhu jsou k dispozici tři atributy. Objekty zpětného CallbackBehaviorAttribute volání duplexního klienta mohou použít a CallbackDebugBehavior atributy ke změně jejich chování za běhu. Druhý atribut , ClientViaBehaviorlze použít k oddělení logického cíle od bezprostředního síťového cíle. Kromě toho můžou typy zpětného volání duplexního klienta používat některé chování na straně služby. Další informace naleznete v tématu Určení chování za běhu služby.

Použití callbackBehaviorAttribute

Pomocí třídy můžete nakonfigurovat nebo rozšířit chování provádění implementace kontraktu zpětného volání v klientské aplikaci CallbackBehaviorAttribute . Tento atribut provádí podobnou funkci pro třídu zpětného volání jako ServiceBehaviorAttribute třída, s výjimkou chování instance a nastavení transakcí.

Třída CallbackBehaviorAttribute musí být použita na třídu, která implementuje kontrakt zpětného volání. Pokud je použita na neduplex kontrakt implementace, je InvalidOperationException vyvolán výjimka za běhu. Následující příklad kódu ukazuje CallbackBehaviorAttribute třídu zpětného volání objektu, který používá SynchronizationContext objekt k určení vlákna zařazování do, ValidateMustUnderstand vlastnost vynucení ověření zprávy a IncludeExceptionDetailInFaults vlastnost vrátit výjimky jako FaultException objekty do služby pro účely ladě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

Povolení toku informací o spravovaných výjimce pomocí callbackDebugBehavior

Tok informací o spravovaných výjimkách v objektu zpětného volání klienta můžete povolit zpět do služby pro účely ladění nastavením IncludeExceptionDetailInFaults vlastnosti buď true prostřednictvím kódu programu, nebo z konfiguračního souboru aplikace.

Vrácení informací o spravovaných výjimce službám může být bezpečnostní riziko, protože podrobnosti o výjimce zveřejňují informace o interní implementaci klienta, kterou by mohly používat neoprávněné služby. Kromě toho, i když CallbackDebugBehavior je možné vlastnosti nastavit také programově, může být při nasazování snadné zapomenout zakázat IncludeExceptionDetailInFaults .

Vzhledem k problémům se zabezpečením důrazně doporučujeme:

  • Konfigurační soubor aplikace slouží k nastavení hodnoty IncludeExceptionDetailInFaults vlastnosti na true.

  • Provedete to pouze ve scénářích řízeného ladění.

Následující příklad kódu ukazuje konfigurační soubor klienta, který dává WCF pokyn, aby vrátil spravované informace o výjimce z objektu zpětného volání klienta ve zprávách 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>

Použití chování ClientViaBehavior

Pomocí chování můžete ClientViaBehavior určit identifikátor jednotného prostředku, pro který se má vytvořit transportní kanál. Toto chování použijte, pokud okamžitý síťový cíl není zamýšleným procesorem zprávy. To umožňuje konverzaci s více segmenty směrování, když volající aplikace nemusí nutně znát konečný cíl nebo když cílová Via hlavička není adresa.

Viz také