Aracılığıyla paylaş


İ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 IncludeExceptionDetailInFaultstruedeğ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.

Ayrıca bkz.