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.