İstemci Çalışma Zamanı Davranışını Belirtme
Windows Communication Foundation (WCF) hizmetleri gibi Windows Communication Foundation (WCF) istemcileri, çalışma zamanı davranışını istemci uygulamasına uyacak şekilde yapılandırılabilir. İstemci çalışma zamanı davranışını belirtmek için üç öznitelik kullanılabilir. Çift yönlü istemci geri çağırma nesneleri, çalışma zamanı davranışlarını değiştirmek için ve CallbackDebugBehavior özniteliklerini kullanabilirCallbackBehaviorAttribute. Diğer özniteliği olan ClientViaBehavior, mantıksal hedefi hemen ağ hedefinden ayırmak için kullanılabilir. Buna ek olarak, çift yönlü istemci geri çağırma türleri hizmet tarafı davranışlarından bazılarını kullanabilir. Daha fazla bilgi için bkz . Hizmet Çalışma Zamanı Davranışını Belirtme.
CallbackBehaviorAttribute'u kullanma
sınıfını kullanarak CallbackBehaviorAttribute bir istemci uygulamasında geri çağırma sözleşmesi uygulamasının yürütme davranışını yapılandırabilir veya genişletebilirsiniz. Bu öznitelik, geri çağırma sınıfı için sınıfla ServiceBehaviorAttribute benzer bir işlev gerçekleştirir ve bu işlev, başlatma davranışı ve işlem ayarları dışındadır.
sınıfı CallbackBehaviorAttribute , geri çağırma sözleşmesini uygulayan sınıfa uygulanmalıdır. Çift yönlü olmayan bir sözleşme uygulamasına uygulanırsa, çalışma zamanında bir InvalidOperationException özel durum oluşturulur. Aşağıdaki kod örneği, sıralanacak iş parçacığını belirlemek için nesnesini kullanan SynchronizationContext bir geri çağırma nesnesinde sınıfını, ValidateMustUnderstand ileti doğrulamayı zorunlu kılma özelliğini ve IncludeExceptionDetailInFaults hata ayıklama amacıyla özel durumları hizmete nesne olarak FaultException döndürme özelliğini gösterirCallbackBehaviorAttribute.
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
Yönetilen Özel Durum Bilgilerinin Akışını Etkinleştirmek için CallbackDebugBehavior Kullanma
Bir istemci geri çağırma nesnesinde yönetilen özel durum bilgilerinin akışını hata ayıklama amacıyla hizmete geri döndürmek için özelliğini true
program aracılığıyla veya uygulama yapılandırma dosyasından IncludeExceptionDetailInFaults olarak ayarlayabilirsiniz.
Özel durum ayrıntıları, yetkisiz hizmetlerin kullanabildiği iç istemci uygulamasıyla ilgili bilgileri kullanıma sunacağından, yönetilen özel durum bilgilerinin hizmetlere döndürüleceği bir güvenlik riski oluşturabilir. Ayrıca, özellikler program aracılığıyla da ayarlansa CallbackDebugBehavior da, dağıtım sırasında devre dışı bırakmak IncludeExceptionDetailInFaults kolay olabilir.
İlgili güvenlik sorunları nedeniyle aşağıdakiler kesinlikle önerilir:
Özelliğinin IncludeExceptionDetailInFaults
true
değerini olarak ayarlamak için bir uygulama yapılandırma dosyası kullanırsınız.Bunu yalnızca denetimli hata ayıklama senaryolarında yaparsınız.
Aşağıdaki kod örneği, WCF'ye SOAP iletilerindeki bir istemci geri çağırma nesnesinden yönetilen özel durum bilgilerini döndürmesini belirten bir istemci yapılandırma dosyası gösterir.
<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 Davranışını Kullanma
Aktarım kanalının ClientViaBehavior oluşturulması gereken Tekdüzen Kaynak Tanımlayıcısı'nı belirtmek için bu davranışı kullanabilirsiniz. Anlık ağ hedefi iletinin hedeflenen işlemcisi olmadığında bu davranışı kullanın. Bu, çağrı yapan uygulamanın nihai hedefi bilmesi gerekmediğinde veya hedef Via
üst bilgi bir adres olmadığında birden çok atlamalı konuşmaları etkinleştirir.