Bagikan melalui


Menentukan Perilaku Layanan Run-Time

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

Gambaran Umum

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

Namun, operasi spesifik, seperti masalah utas atau manajemen instans, tidak terlihat jelas bagi klien. Setelah menerapkan kontrak layanan, Anda dapat mengonfigurasi sejumlah besar karakteristik operasi dengan menggunakan perilaku. Perilaku adalah objek yang mengubah runtime Windows Communication Foundation (WCF) dengan mengatur properti runtime atau dengan memasukkan tipe 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 umum diminta. Karena merupakan 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, menjelaskan berbagai cakupan di mana perilaku dapat beroperasi, serta memberikan deskripsi cepat tentang banyak perilaku yang diberikan oleh sistem di berbagai cakupan yang mungkin menarik bagi pengembang WCF.

ServiceBehaviorAttribute dan OperationBehaviorAttribute

Perilaku yang paling penting adalah ServiceBehaviorAttribute atribut 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 atur properti. Misalnya, contoh kode berikut menunjukkan implementasi operasi yang menggunakan properti OperationBehaviorAttribute.Impersonation untuk memastikan bahwa pemanggil operasi ini mendukung impersonasi.

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 lebih lanjut dari proses pengikatan. Misalnya, operasi yang memerlukan transaksi dari klien harus dikonfigurasi untuk menggunakan pengikatan yang mendukung transaksi yang mengalir.

Layanan Singleton yang Dikenal Baik

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

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

Namun, Anda juga dapat membuat objek layanan sendiri dan membuat host layanan menggunakan objek tersebut. Untuk melakukan hal tersebut, Anda juga harus menetapkan properti ServiceBehaviorAttribute.InstanceContextMode ke Single, atau akan terjadi pengecualian saat host layanan dibuka.

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

Perhatikan bahwa ketika objek disediakan untuk konstruktor ini, beberapa fitur yang terkait dengan perilaku instancing Windows Communication Foundation (WCF) bekerja secara berbeda. Misalnya, memanggil InstanceContext.ReleaseServiceInstance tidak berpengaruh ketika instance objek yang sudah dikenal disediakan. Demikian pula, mekanisme rilis instans lainnya diabaikan. Kelas ServiceHost selalu berperilaku seolah-olah properti OperationBehaviorAttribute.ReleaseInstanceMode ini diatur ke ReleaseInstanceMode.None dalam setiap 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 utas sendiri dalam setiap operasi dalam layanan tersebut. Perilaku titik akhir beroperasi di seluruh titik akhir; banyak perilaku titik akhir yang disediakan sistem adalah untuk fungsionalitas klien. Perilaku kontrak beroperasi pada level kontrak, dan perilaku operasi memodifikasi pelaksanaan operasi.

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

Misalnya, publikasi metadata dikonfigurasi dengan menggunakan ServiceMetadataBehavior objek . 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. Memungkinkan debug layanan untuk objek panggilan balik WCF.

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

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

  • MustUnderstandBehavior. Instruksikan WCF untuk menonaktifkan pemrosesan MustUnderstand.

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

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

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