Ügyfél futásidejű viselkedésének megadása
A Windows Communication Foundation (WCF) ügyfelek, például a Windows Communication Foundation (WCF) szolgáltatásai úgy konfigurálhatók, hogy az ügyfélalkalmazásnak megfelelően módosítsák a futásidejű viselkedést. Három attribútum érhető el az ügyfél futásidejű viselkedésének megadásához. A kétoldalas ügyfélvisszahívási objektumok a futtatási idő viselkedésének módosításához használhatják az CallbackBehaviorAttributeCallbackDebugBehavior és az attribútumokat. A másik attribútum a ClientViaBehaviorlogikai célhely és az azonnali hálózati célhely elválasztására használható. Emellett a kétoldalas ügyfélvisszahívási típusok a szolgáltatásoldali viselkedések némelyikét is használhatják. További információ: A szolgáltatás futásidejű viselkedésének megadása.
A CallbackBehaviorAttribute használata
Az osztály használatával konfigurálhatja vagy kibővítheti a visszahívási szerződések implementálásának végrehajtási viselkedését egy CallbackBehaviorAttribute ügyfélalkalmazásban. Ez az attribútum az osztályhoz ServiceBehaviorAttribute hasonló függvényt hajt végre a visszahívási osztályhoz, kivéve az instancing viselkedését és a tranzakciós beállításokat.
Az CallbackBehaviorAttribute osztályt a visszahívási szerződést megvalósító osztályra kell alkalmazni. Ha nem egyszerű szerződés-végrehajtásra vonatkozik, a rendszer kivételt InvalidOperationException alkalmaz a futtatáskor. Az alábbi kódpéldában egy CallbackBehaviorAttribute olyan osztály látható egy visszahívási objektumon, amely az SynchronizationContext objektummal határozza meg a marsallandó szálat, az ValidateMustUnderstand üzenetérvényesítést kényszerítő tulajdonságot, valamint a IncludeExceptionDetailInFaults tulajdonságot, hogy hibakeresés céljából objektumként FaultException visszaadja a kivételeket a szolgáltatásnak.
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
A CallbackDebugBehavior használata a felügyelt kivételadatok folyamatának engedélyezéséhez
Az ügyfél visszahívási objektumának felügyelt kivételinformációi hibakeresési célokra való visszahívását úgy engedélyezheti, hogy true
a IncludeExceptionDetailInFaults tulajdonságot programozott módon vagy alkalmazáskonfigurációs fájlból állítsa be.
A felügyelt kivételadatok szolgáltatásoknak való visszaadása biztonsági kockázatot jelenthet, mivel a kivétel részletei olyan belső ügyfél-implementációval kapcsolatos információkat fednek fel, amelyeket jogosulatlan szolgáltatások használhatnak. Emellett bár a CallbackDebugBehavior tulajdonságok programozott módon is beállíthatók, a telepítéskor könnyen elfelejthető letiltani IncludeExceptionDetailInFaults .
Az érintett biztonsági problémák miatt erősen ajánlott:
A tulajdonság
true
értékét alkalmazáskonfigurációs fájllal állíthatja IncludeExceptionDetailInFaults be.Ezt csak szabályozott hibakeresési forgatókönyvekben teheti meg.
Az alábbi példakód egy ügyfélkonfigurációs fájlt mutat be, amely arra utasítja a WCF-et, hogy a SOAP-üzenetekben lévő ügyfélvisszahívási objektumból adjon vissza felügyelt kivételadatokat.
<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>
A ClientViaBehavior viselkedésének használata
A viselkedéssel ClientViaBehavior megadhatja azt az egységes erőforrás-azonosítót, amelyhez létre kell hozni az átviteli csatornát. Ezt a viselkedést akkor használja, ha az azonnali hálózati cél nem az üzenet tervezett feldolgozója. Ez lehetővé teszi a több ugrásos beszélgetéseket, ha a hívó alkalmazás nem feltétlenül ismeri a végső célhelyet, vagy ha a célfejléc Via
nem cím.