Menentukan Perilaku Run-Time Layanan

Setelah Anda merancang kontrak layanan (Merancang Kontrak Layanan) dan menerapkan kontrak layanan Anda (Mengimplementasikan Kontrak Layanan), Anda dapat mengonfigurasi perilaku operasi runtime layanan. Topik ini membahas perilaku layanan dan operasi yang disediakan oleh sistem dan menjelaskan lokasi untuk menemukan informasi selengkapnya untuk membuat perilaku baru. Meskipun beberapa perilaku diterapkan sebagai atribut, banyak diantaa perilaku tersebut yang diterapkan menggunakan file konfigurasi aplikasi atau secara terprogram. Untuk informasi selengkapnya tentang mengonfigurasi aplikasi layanan Anda, lihat Mengonfigurasi Layanan.

Gambaran Umum

Kontrak tersebut mendefinisikan input, output, jenis data, dan kemampuan layanan jenis tersebut. Menerapkan kontrak layanan membuat kelas di mana, ketika kelas itu dikonfigurasi dengan pengikatan pada alamat, kelas itu memenuhi kontrak yang diterapkannya. Informasi kontraktual, pengikatan, dan alamat semuanya diketahui oleh klien; tanpa mereka, klien tidak dapat menggunakan layanan.

Namun, operasi spesifik, seperti masalah rangkaian atau manajemen instans, menjadi buram bagi klien. Setelah menerapkan kontrak layanan, Anda dapat mengonfigurasi sejumlah besar karakteristik operasi dengan menggunakan perilaku. Perilaku adalah objek yang memodifikasi runtime Windows Communication Foundation (WCF) dengan mengatur properti runtime atau dengan menyisipkan jenis kustomisasi ke dalam runtime. Untuk informasi selengkapnya tentang memodifikasi runtime dengan membuat perilaku yang ditentukan pengguna, lihat Memperluas ServiceHost dan Lapisan Model Layanan.

Atribut System.ServiceModel.ServiceBehaviorAttribute dan System.ServiceModel.OperationBehaviorAttribute adalah perilaku yang paling berguna dan mengekspos fitur operasi yang paling sering diminta. Karena atribut tersebut tetaplah atribut, Anda menerapkannya ke implementasi layanan atau operasi. Perilaku lain, seperti System.ServiceModel.Description.ServiceMetadataBehavior atau System.ServiceModel.Description.ServiceDebugBehavior, biasanya diterapkan menggunakan file konfigurasi aplikasi, meskipun Anda dapat menggunakannya secara terprogram.

Topik ini memberikan gambaran umum tentang atribut ServiceBehaviorAttribute dan OperationBehaviorAttribute, topik ini menjelaskan berbagai cakupan di mana perilaku dapat beroperasi, dan memberikan deskripsi cepat tentang banyak perilaku yang disediakan sistem di berbagai cakupan yang mungkin menarik bagi pengembang WCF.

ServiceBehaviorAttribute dan OperationBehaviorAttribute

Perilaku yang paling penting adalah atribut ServiceBehaviorAttribute dan OperationBehaviorAttribute, yang dapat Anda gunakan untuk mengontrol:

  • Masa pakai instans

  • Dukungan konkurensi dan sinkronisasi

  • Perilaku konfigurasi

  • Perilaku transaksi

  • Perilaku serialisasi

  • Transformasi metadata

  • Masa pakai sesi

  • Pemfilteran alamat dan pemrosesan header

  • Peniruan

  • Untuk menggunakan atribut ini, tandai implementasi layanan atau operasi dengan atribut yang sesuai dengan cakupan tersebut dan aturlah properti itu. Misalnya, contoh kode berikut menunjukkan implementasi operasi yang menggunakan properti OperationBehaviorAttribute.Impersonation untuk mewajibkan pemanggil operasi ini mendukung peniruan.

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(
    Name="SampleHello",
    Namespace="http://microsoft.wcf.documentation"
  )]
  public interface IHello
  {
    [OperationContract]
    string Hello(string greeting);
  }

  public class HelloService : IHello
  {

    public HelloService()
    {
      Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
    }

    ~HelloService()
    {
      Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
    }

    [OperationBehavior(Impersonation=ImpersonationOption.Required)]
    public string Hello(string greeting)
    {
      Console.WriteLine("Called by: " + Thread.CurrentPrincipal.Identity.Name);
      Console.WriteLine("IsAuthenticated: " + Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString());
      Console.WriteLine("AuthenticationType: " + Thread.CurrentPrincipal.Identity.AuthenticationType.ToString());

      Console.WriteLine("Caller sent: " + greeting);
      Console.WriteLine("Sending back: Hi, " + Thread.CurrentPrincipal.Identity.Name);
      return "Hi, " + Thread.CurrentPrincipal.Identity.Name;
    }
  }
}
Imports System.ServiceModel
Imports System.Threading

Namespace Microsoft.WCF.Documentation
    <ServiceContract(Name:="SampleHello", Namespace:="http://microsoft.wcf.documentation")> _
    Public Interface IHello
        <OperationContract> _
        Function Hello(ByVal greeting As String) As String
    End Interface

    Public Class HelloService
        Implements IHello

        Public Sub New()
            Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
        End Sub

        Protected Overrides Sub Finalize()
            Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
        End Sub

        <OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
        Public Function Hello(ByVal greeting As String) As String Implements IHello.Hello
            Console.WriteLine("Called by: " & Thread.CurrentPrincipal.Identity.Name)
            Console.WriteLine("IsAuthenticated: " & Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString())
            Console.WriteLine("AuthenticationType: " & Thread.CurrentPrincipal.Identity.AuthenticationType.ToString())

            Console.WriteLine("Caller sent: " & greeting)
            Console.WriteLine("Sending back: Hi, " & Thread.CurrentPrincipal.Identity.Name)
            Return "Hi, " & Thread.CurrentPrincipal.Identity.Name
        End Function
    End Class
End Namespace

Banyak properti memerlukan dukungan tambahan dari pengikatan. Misalnya, operasi yang memerlukan transaksi dari klien harus dikonfigurasi untuk menggunakan pengikatan yang mendukung transaksi yang beralur.

Well-Known Singleton Services

Anda dapat menggunakan atribut ServiceBehaviorAttribute dan OperationBehaviorAttribute untuk mengontrol masa pakai tertentu, baik dari InstanceContext dan objek layanan yang mengimplementasikan operasi.

Misalnya, properti ServiceBehaviorAttribute.InstanceContextMode mengontrol seberapa sering InstanceContext dirilis, serta properti OperationBehaviorAttribute.ReleaseInstanceMode dan ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete mengontrol kapan objek layanan dirilis.

Namun, Anda juga dapat membuat objek layanan sendiri dan membuat host layanan menggunakan objek tersebut. Untuk melakukannya, Anda juga harus mengatur properti ServiceBehaviorAttribute.InstanceContextMode ke Single atau pengecualian ditampilkan saat host layanan dibuka.

Gunakan konstruktor ServiceHost(Object, Uri[]) untuk membuat layanan tersebut. Konstruktor menyediakan alternatif untuk menerapkan System.ServiceModel.Dispatcher.IInstanceContextInitializer kustom ketika Anda ingin menyediakan instans objek tertentu untuk digunakan oleh layanan database tunggal. Anda dapat menggunakan kelebihan beban ini saat jenis implementasi layanan Anda sulit dibangun (misalnya, jika tidak menerapkan konstruktor publik tanpa parameter).

Harap dicatat bahwa ketika objek disediakan untuk konstruktor ini, beberapa fitur yang terkait dengan perilaku instancing Windows Communication Foundation (WCF) bekerja secara berbeda. Misalnya, panggilan InstanceContext.ReleaseServiceInstance tidak berpengaruh ketika instans objek terkenal disediakan. Demikian pula, mekanisme rilis instans lainnya diabaikan. Kelas ServiceHost selalu berperilaku seolah-olah properti OperationBehaviorAttribute.ReleaseInstanceMode diatur ke ReleaseInstanceMode.None untuk semua operasi.

Perilaku Layanan, Titik Akhir, Kontrak, dan Operasi Lainnya

Perilaku layanan, seperti atribut ServiceBehaviorAttribute, beroperasi di seluruh layanan. Misalnya, jika Anda mengatur properti ServiceBehaviorAttribute.ConcurrencyMode ke ConcurrencyMode.Multiple Anda harus menangani masalah sinkronisasi rangkaian di dalam setiap operasi di layanan tersebut sendiri. Perilaku titik akhir beroperasi di seluruh titik akhir; banyak perilaku titik akhir yang disediakan sistem adalah untuk fungsionalitas klien. Perilaku kontrak beroperasi pada tingkat kontrak, dan perilaku operasi memodifikasi pengiriman operasi.

Banyak dari perilaku ini diimplementasikan pada atribut, dan Anda memanfaatkannya saat Anda menjalankan atribut ServiceBehaviorAttribute dan OperationBehaviorAttribute —dengan menerapkannya ke kelas layanan atau implementasi operasi yang sesuai. Perilaku lain, seperti objek ServiceMetadataBehavior atau ServiceDebugBehavior, biasanya diterapkan menggunakan file konfigurasi aplikasi, meskipun juga dapat digunakan secara terprogram.

Misalnya, publikasi metadata dikonfigurasi dengan menggunakan objek ServiceMetadataBehavior. File konfigurasi aplikasi berikut menunjukkan penggunaan yang paling umum.

<configuration>
  <system.serviceModel>
    <services>
      <service 
        name="Microsoft.WCF.Documentation.SampleService"
        behaviorConfiguration="metadataSupport"
      >
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/SampleService" />
          </baseAddresses>
        </host>
        <endpoint
          address=""
          binding="wsHttpBinding"
          contract="Microsoft.WCF.Documentation.ISampleService"
        />
        <!-- Adds a WS-MetadataExchange endpoint at -->
        <!-- "http://localhost:8080/SampleService/mex" -->
        <endpoint
           address="mex"
           binding="mexHttpBinding"
           contract="IMetadataExchange"
        />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
      <behavior name="metadataSupport">
        <!-- Enables the IMetadataExchange endpoint in services that -->
        <!-- use "metadataSupport" in their behaviorConfiguration attribute. -->
        <!-- In addition, the httpGetEnabled and httpGetUrl attributes publish -->
        <!-- Service metadata for retrieval by HTTP/GET at the address -->
        <!-- "http://localhost:8080/SampleService?wsdl" -->
        <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  </system.serviceModel>
</configuration>

Bagian berikut menjelaskan banyak perilaku yang disediakan sistem yang paling berguna yang dapat Anda gunakan untuk memodifikasi pengiriman runtime layanan atau klien Anda. Lihat topik referensi untuk menentukan cara menggunakan masing-masing topik.

Perilaku Layanan

Perilaku berikut beroperasi pada layanan.

Perilaku Titik Akhir

Perilaku berikut beroperasi pada titik akhir. Banyak dari perilaku ini digunakan dalam aplikasi klien.

  • CallbackBehaviorAttribute. Mengonfigurasi implementasi layanan panggilan balik dalam aplikasi klien dupleks.

  • CallbackDebugBehavior. Mengaktifkan penelusuran kesalahan layanan untuk objek panggilan balik WCF.

  • ClientCredentials. Memungkinkan pengguna untuk mengonfigurasi mandat klien dan layanan serta pengaturan autentikasi mandat layanan untuk digunakan pada klien.

  • ClientViaBehavior. Digunakan oleh klien untuk menentukan Pengidentifikasi Sumber Daya Seragam (URI) tempat saluran transportasi harus dibuat.

  • MustUnderstandBehavior. Menginstruksikan WCF untuk menonaktifkan pemrosesan MustUnderstand.

  • SynchronousReceiveBehavior. Menginstruksikan runtime untuk menggunakan proses penerimaan sinkron untuk saluran.

  • TransactedBatchingBehavior. Mengoptimalkan operasi penerimaan untuk transportasi yang mendukung penerimaan transaksi.

Perilaku Kontrak

DeliveryRequirementsAttribute. Menentukan persyaratan fitur yang harus disediakan oleh pengikatan ke layanan atau implementasi klien.

Perilaku Operasi

Perilaku operasi berikut menentukan serialisasi dan kontrol transaksi untuk operasi.

Lihat juga