Delen via


Runtimegedrag van client opgeven

WcF-clients (Windows Communication Foundation), zoals WCF-services (Windows Communication Foundation), kunnen worden geconfigureerd om het runtimegedrag aan te passen aan de clienttoepassing. Er zijn drie kenmerken beschikbaar voor het opgeven van runtimegedrag van de client. Duplex client callback-objecten kunnen de CallbackBehaviorAttribute en CallbackDebugBehavior kenmerken gebruiken om hun runtimegedrag te wijzigen. Het andere kenmerk, ClientViaBehaviorkan worden gebruikt om de logische bestemming te scheiden van de onmiddellijke netwerkbestemming. Bovendien kunnen dubbelzijdige client callbacktypen enkele van het gedrag aan de servicezijde gebruiken. Zie Run-Time-gedrag van de service opgeven voor meer informatie.

CallbackBehaviorAttribute gebruiken

U kunt het uitvoeringsgedrag van een callbackcontract-implementatie in een clienttoepassing configureren of uitbreiden met behulp van de CallbackBehaviorAttribute klasse. Dit kenmerk voert een vergelijkbare functie uit voor de callback-klasse als klasse ServiceBehaviorAttribute , met uitzondering van gedrag en transactie-instellingen voor instancing.

De CallbackBehaviorAttribute klasse moet worden toegepast op de klasse waarmee het callback-contract wordt geïmplementeerd. Als deze wordt toegepast op een niet-duplex-contractuitvoering, wordt er een InvalidOperationException uitzondering gegenereerd tijdens de uitvoering. In het volgende codevoorbeeld ziet u een CallbackBehaviorAttribute klasse voor een callback-object dat gebruikmaakt van het SynchronizationContext object om de thread te bepalen waarnaar marshal moet worden aangegeven, de ValidateMustUnderstand eigenschap voor het afdwingen van berichtvalidatie en de IncludeExceptionDetailInFaults eigenschap om uitzonderingen als objecten als FaultException objecten te retourneren aan de service voor foutopsporing.

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

CallbackDebugBehavior gebruiken om de stroom van beheerde uitzonderingsgegevens in te schakelen

U kunt de stroom van beheerde uitzonderingsgegevens inschakelen in een client callback-object terug naar de service voor foutopsporing door de IncludeExceptionDetailInFaults eigenschap in te stellen op true programmatisch of vanuit een toepassingsconfiguratiebestand.

Het retourneren van beheerde uitzonderingsinformatie aan services kan een beveiligingsrisico zijn, omdat uitzonderingsdetails informatie weergeven over de interne client-implementatie die niet-geautoriseerde services kunnen gebruiken. Hoewel de CallbackDebugBehavior eigenschappen ook programmatisch kunnen worden ingesteld, kan het gemakkelijk zijn om uit te schakelen IncludeExceptionDetailInFaults bij het implementeren.

Vanwege de betrokken beveiligingsproblemen wordt ten zeere aangeraden:

  • U gebruikt een toepassingsconfiguratiebestand om de waarde van de IncludeExceptionDetailInFaults eigenschap in te stellen op true.

  • U doet dit alleen in beheerde foutopsporingsscenario's.

In het volgende codevoorbeeld ziet u een clientconfiguratiebestand waarin WCF wordt geïnstrueerd om beheerde uitzonderingsgegevens van een client callback-object in SOAP-berichten te retourneren.

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

ClientViaBehavior-gedrag gebruiken

U kunt het ClientViaBehavior gedrag gebruiken om de Uniform Resource Identifier op te geven waarvoor het transportkanaal moet worden gemaakt. Gebruik dit gedrag wanneer de onmiddellijke netwerkbestemming niet de beoogde processor van het bericht is. Hierdoor kunnen gesprekken met meerdere hops worden uitgevoerd wanneer de aanroepende toepassing niet noodzakelijkerwijs de ultieme bestemming kent of wanneer de doelheader Via geen adres is.

Zie ook