Megosztás a következőn keresztül:


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

Lásd még